[英]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.