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
这里有两个主要错误,在各种组合中
$
获取变量的值,在设置变量(或更改其属性)时切勿使用:
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
的值中
“${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[@]}"