Linux 填充变量时,Bashscript引发命令错误

Linux 填充变量时,Bashscript引发命令错误,linux,bash,Linux,Bash,我在批处理脚本中有以下两行代码 iperf_options=" -O 10 -V -i 10 --get-server-output -P " $streams $iperf_options=$iperf_options $proto 及 但是当我运行这个时,我得到了以下错误 /带宽:第116行:-O:未找到命令 我只是想写一个字符串,然后把它附加到一个变量上,那么为什么它会在-O上抛出错误呢 我已经浏览过网络,但我似乎找到了“=”周围空间的内容 非常感谢您的帮助 谢谢 显

我在批处理脚本中有以下两行代码

iperf_options=" -O 10 -V -i 10 --get-server-output -P " $streams
$iperf_options=$iperf_options $proto

但是当我运行这个时,我得到了以下错误

/带宽:第116行:-O:未找到命令

我只是想写一个字符串,然后把它附加到一个变量上,那么为什么它会在-O上抛出错误呢

我已经浏览过网络,但我似乎找到了“=”周围空间的内容

非常感谢您的帮助

谢谢

显示错误的代码块

proto=-u
streams=2
iperf_options=" -O 10 -V -i 10 --get-server-output -P " $streams
$iperf_options=$iperf_options $proto
运行此命令将释放此消息

./test
./test: line 3: 2: command not found
./test: line 4: =: command not found

这里有两个主要错误,在各种组合中

  • 使用
    $
    获取变量的值,在设置变量(或更改其属性)时切勿使用:

  • 空格是shell语法中的关键分隔符;添加(或删除)它们可能会以意外的方式更改命令的含义:

    var = value    # Runs `var` as a command, passing "=" and "value" as arguments
    var=val1 val2  # Runs `val2` as a command, with var=val1 set in its environment
    
    var="val1 val2"  # Sets `var1` to `val1 val2`
    
    因此,在这个命令中:

    iperf_options=" -O 10 -V -i 10 --get-server-output -P " $streams
    
    iperf_options=“…”
    $streams
    之间的空格表示它将展开
    $streams
    ,并尝试将其作为命令运行(在其环境中设置
    iperf_options
    )。你想要的是:

    iperf_options=" -O 10 -V -i 10 --get-server-output -P $streams"
    
    这里,由于
    $streams
    是双引号字符串的一部分,因此将对其进行扩展(变量在双引号内展开,但不在单引号内展开),其值将包含在分配给
    iperf\u options
    的值中

  • 实际上还有第三个错误(或者至少是可疑的脚本实践):将选项列表构建为简单的字符串变量。这在简单的情况下有效,但是。如果您使用的shell支持数组(例如bash、ksh、zsh等,但不支持破折号),那么最好使用它们,并将每个选项/参数存储为单独的数组元素,然后使用
    “${arrayname[@]}”
    展开数组以完整地取出所有元素(是的,实际上需要所有的引号、大括号、方括号等)


    最后,我建议您检查脚本是否存在常见错误。不过有一个警告:它不会捕获所有错误,因为它不知道您的意图。例如,如果它看到
    var=val1 val2
    ,它将假定您打算作为命令运行
    val2
    ,并且不会将其标记为错误。

    抱歉,但是变量分配和错误消息看起来都不像
    批处理文件
    。您的意思是
    bash
    ?您的两行命令都不是MS-DOS、IBM OS/2或Microsoft Windows系统上的命令解释器可以理解的命令。在将[]标记分配给您的问题之前,您是否尝试阅读过该标记的描述?很抱歉,我很愚蠢,您是对的,我想键入bash。在bash中,您必须省略变量和值之间的空格,这意味着您必须编写
    a=110
    ,而不是
    a=110
    ,另一件事是,当你想要声明一个变量时,你不必使用
    $
    ,但是当你调用它时,你就有了,例如
    a=110
    ,然后像这样调用它
    echo$a
    ,祝你好运!所以上面的弗里曼没有空间。还是字符串中的空格“-O…”。。。被认为是一个空间。因为它能让我用它去腐蚀它。这是$iperf_选项=$iperf_选项。。。这就是问题的原因对了,谢谢你。我理解var=值之间的空格一定不存在,但我可以看到它是在我添加的带引号的字符串之后。哦,感谢您对该站点的介绍来检查它,它将被添加到regex checker:)旁边的书签中,以检查将其更改为iperf_options=“-O 10….$streams$proto”,但稍后将切换到数组。感谢您花时间回答这个问题并给出详细解释。@DevilWAH只要您存储的任何选项/参数都不包含空格、通配符、引号、转义符等就行了——基本上只要它们是纯文本,没有空格分隔的shell语法,就可以使用纯字符串。
    iperf_options=" -O 10 -V -i 10 --get-server-output -P " $streams
    
    iperf_options=" -O 10 -V -i 10 --get-server-output -P $streams"
    
    proto="-u"    # If this'll always have exactly one value, plain string is ok
    streams=2     # Same here
    iperf_options=(-O 10 -V -i 10 --get-server-output -P "$streams")
    iperf_options=("${iperf_options[@]}" "$proto")
    # ...
    iperf "${iperf_options[@]}"