問:
將一個命令保存到一個變量中,以便稍后再使用(不是命令的輸出,而是命令本身)。
有一個簡單的腳本如下:
command="ls";
echo?"Command:?$command";?#Output?is:?Command:?ls
b=`$command`;
echo?$b;?#Output?is:?public_html?REV?test...?(command?worked?successfully)
然而,當嘗試一些更復雜的東西時,它失敗了。例如,如果這樣做
command="ls?|?grep?-c?'^'";
輸出為:
Command:?ls?|?grep?-c?'^'
ls:?cannot?access?|:?No?such?file?or?directory
ls:?cannot?access?grep:?No?such?file?or?directory
ls:?cannot?access?'^':?No?such?file?or?directory
如何將這樣(帶有管道/多個命令)的命令存儲在變量中以供以后使用?
答案:
對于帶有管道或重定向的組合命令最推薦的方式是將其封裝到一個函數里,然后在需要時直接調用即可。
對于命令?ls | grep -c '^'
?可以寫為如下形式:
func1()?{ls?|?grep?-c?'^'
}cd?/path/to/work#?when?need
func1
如果需要將?func1
?寫為一行,則代碼如下:
func1()?{??ls?|?grep?-c?'^';?}
這里需要在?{}
?里面命令的末尾加上分號?;
。
一個高贊回答是使用?eval
,代碼如下:
x="ls?|?wc"
eval?"$x"
y=$(eval?"$x")
echo?"$y"
但是其中?eval
?是一個非常容易引發錯誤的內置命令,在沒有警告用戶可能存在不可預料的解析行為風險的情況下,不應推薦使用它。使用?eval
?命令時需要非常小心,因為它可以使得代碼可讀性較差并且容易引入安全漏洞。朋友們有踩到過?eval
?命令的坑嗎,可以在評論區留言交流一下。