【问题标题】:if arguments is equal to this string, define a variable like this string如果参数等于这个字符串,定义一个像这个字符串一样的变量
【发布时间】:2012-04-01 10:20:52
【问题描述】:

我正在编写一些 bash 脚本,现在我得到了一个变量调用 source 和一个数组调用 samples,如下所示:

source='country'
samples=(US Canada Mexico...)

因为我想扩大来源的数量(并且每个来源都有自己的样本),所以我尝试添加一些参数来做到这一点。我试过这个:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

但是当我运行我的脚本source countries.sh country 时,它不起作用。 我做错了什么?

【问题讨论】:

  • 怎么不行?当你运行它时,你会得到一个错误,或者它说“再试一次”,或者别的什么?
  • 是的,您可能会认为“这个问题非常简单”。但你已经考虑了一段时间了。请考虑编辑您的问题以包含所需的输出和您收到的任何错误消息。 +1 用于实际尝试某些东西和良好的问题格式。祝你好运。
  • 为什么此代码与建议和接受的解决方案相同?这令人困惑......我猜最初的问题在 if 语句的左括号之后和右括号之前没有空格?
  • @Stef 如果你仔细观察,$1="country"$1 = "country"

标签: bash scripting arguments


【解决方案1】:

您似乎希望将命令行参数解析到您的 bash 脚本中。我最近自己搜索过这个。我遇到了以下内容,我认为这将有助于您解析论点:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

我将下面的 sn-p 添加为 tl;dr

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts “ht:r:p:v” OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -t test -r 服务器 -p 密码 -v

【讨论】:

    【解决方案2】:

    不要忘记空格:

    source=""
    samples=("")
    if [ $1 = "country" ]; then
       source="country"
       samples="US Canada Mexico..."
    else
      echo "try again"
    fi
    

    【讨论】:

    • 我不敢相信我在这上面花了三个小时,而且只是空间问题!!!!...谢谢@Alex
    • 当左边的变量是一个空字符串时,我遇到了这个问题。修复是if [ "$1" = "country" ]; then
    • 好的,就是这样。 Bash 正式获得我的投票,认为它是最过时但仍在使用的命令语言。语法是如此不直观,它很痛苦。在 2016+ 年真的没有它的地方。 @Systemd 作者:您能否在下一个项目中创建“构建一个不会烂的 Linux shell”?我会向你扔钱。
    • @masi 有时我认为 unix 的初衷是“通过默默无闻的工作保障”。如果这些工具使用起来晦涩难懂,而且在没有大师传给帕德万的内部知识的情况下,通常是那些未洗过的大人物无法接触到的,这将确保那些“知情者”总能找到工作。这种理念在整个“RFC”结构中很明显,并且在人工文档中使用了华丽的语言,虽然在技术上告诉您如何使用这些工具,但实际上只是为了满足记录工具的要求。变化不大。
    • 如果脚本完全是“逻辑重”(>1 if, >0 while...)我强烈尝试使用 Python。 subprocess.runos.exec* 可以走得很远。
    【解决方案3】:

    您可以使用“=”或“==”运算符在 bash 中进行字符串比较。重要的因素是括号内的间距。正确的方法是括号内包含间距,运算符包含间距。在某些情况下,不同的组合会起作用;但是,以下是一个通用示例。

    if [ "$1" == "something" ]; then     ## GOOD
    
    if [ "$1" = "something" ]; then      ## GOOD
    
    if [ "$1"="something" ]; then        ## BAD (operator spacing)
    
    if ["$1" == "something"]; then       ## BAD (bracket spacing)
    

    另外,请注意双括号的处理方式与单括号略有不同...

    if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
    if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).
    
    if [ $a == z* ]; then     # File globbing and word splitting take place.
    if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).
    

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 2012-01-27
      • 2019-04-15
      • 2020-07-02
      • 1970-01-01
      • 2021-12-06
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多