簡體   English   中英

BASH:執行存儲在數組中的命令

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

您可以為uptimenproc創建包裝器以保持一致性,但只要您不需要傳遞任何參數,就沒有必要。

有關我建議的更完整示例,請參閱此心跳腳本和特別是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM