![](/img/trans.png)
[英]Execute bash command stored in associative array over SSH, store result
[英]BASH: Execute commands stored in array
我正在尝试执行如下所示的 shell 脚本
cmds=('uptime' 'free -m' 'nproc')
for cmd in ${cmds[@]};
do
echo $($cmd)
done
由于空间的原因,执行在free -m
执行方面正在中断。
vagrant@vagrant-ubuntu-trusty-64:~$ bash for_my_script.sh
03:42:50 up 56 min, 1 user, load average: 0.00, 0.00, 0.00
total used free shared buff/cache available
Mem: 499928 108516 43204 1844 348208 366140
Swap: 0 0 0
for_my_script.sh: line 5: -m: command not found
1
vagrant@vagrant-ubuntu-trusty-64:~$
我尝试通过将命令存储在变量中来迭代 for
vagrant@vagrant-ubuntu-trusty-64:~$ cmds="uptime,free -m"
vagrant@vagrant-ubuntu-trusty-64:~$ for cmd in "${cmds//,/ }"; do echo "$($cmd)"; done
uptime: invalid option -- 'm'
vagrant@vagrant-ubuntu-trusty-64:~$ cmds="uptime,'free -m'"
vagrant@vagrant-ubuntu-trusty-64:~$ for cmd in "${cmds//,/ }"; do echo "$($cmd)"; done
uptime: invalid option -- 'm'
没有成功。
接触IFS
是解决此类问题的唯一方法吗? 任何输入都非常感谢。
谢谢你。
接受的答案仍然涉及不带引号的字符串,这是不鼓励和容易出错的。 您可以按照@Fravadona 的建议使用eval
,但eval
也很难正确/安全地使用。
相反,请考虑创建函数来包装要运行的命令; 那么你不需要处理字符串中的嵌套参数。 函数还可以轻松组合更复杂的行为(管道、条件等),而不会使执行循环复杂化。 就像是:
do_free() { free -m; }
cmds=(uptime do_free nproc)
for cmd in "${cmds[@]}"; do
"$cmd" # notice that you don't need echo $("$cmd"); it's generally redundant
done
您可以为uptime
和nproc
创建包装器以保持一致性,但只要您不需要传递任何参数,就没有必要。
有关我建议的更完整示例,请参阅此心跳脚本和特别是COMMANDS
数组。
您必须从以下位置更改代码:
cmds=('uptime' 'free -m' 'nproc')
for cmd in ${cmds[@]};
do
echo $(${cmd})
done
进入
cmds=('uptime' 'free -m' 'nproc')
for cmd in "${cmds[@]}";
do
echo $(${cmd})
done
您错过了${cmds[@]}
周围的双引号。
在这种特定情况下,正确的方法是使用eval
,因此您的脚本应该是:
cmds=('uptime' 'free -m' 'nproc')
for cmd in "${cmds[@]}"
do
eval "$cmd"
done
注意:也就是说,如果您以与在终端中键入命令相同的方式存储每个命令。
让我们看几个例子:
# cmd='echo "a b"'
# eval "$cmd"
a b
# $cmd
"a b"
# echo $(${cmd})
"a b"
#
# cmd='echo a; echo b'
# eval "$cmd"
a
b
# $cmd
a; echo b
# echo $(${cmd})
a; echo b
#
# cmd='echo;'
# eval "$cmd"
# $cmd
bash: echo;: command not found...
# echo $(${cmd})
bash: echo;: command not found...
#
AL:当你不知道如何以及何时使用它时, eval
是邪恶的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.