我正在嘗試執行如下所示的 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是解決此類問題的唯一方法嗎?任何輸入都非常感謝。
謝謝你。
uj5u.com熱心網友回復:
您必須從以下位置更改代碼:
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[@]}。
uj5u.com熱心網友回復:
接受答案的警告
在這種特定情況下,正確的方法是使用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是邪惡的
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358771.html
下一篇:為什么變數在管道后改變?
