猿问

如何将命令存储在shell脚本中的变量中?

如何将命令存储在shell脚本中的变量中?

我想在一个变量中存储一个以后使用的命令(不是命令的输出,而是命令本身)。

我有一个简单的脚本如下:

command="ls";echo "Command: $command"; #Output is: Command: lsb=`$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

知道我如何将这样的命令(使用管道/多个命令)存储在变量中以供以后使用吗?


MM们
浏览 528回答 3
3回答

冉冉说

使用val:x="ls | wc"eval "$x"y=$(eval "$x")echo "$y"

慕码人2483693

做不使用eval!它有引入任意代码执行的主要风险。BashFAQ-50-我试图在变量中放一个命令,但是复杂的情况总是失败的。把它放在一个数组中,用双引号展开所有单词。"${arr[@]}"到不让IFS分词分词.cmdArgs=()cmdArgs=('date' '+%H:%M:%S')并查看内部数组的内容。这个declare -p允许您在单独的索引中查看包含每个命令参数的数组的内容。如果其中一个参数包含空格,则在数组中添加时引用内部语句将防止由于分字而导致数组分裂。declare -p cmdArgs declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'并将命令执行为"${cmdArgs[@]}"23:15:18(或)全部使用bash函数来运行命令,cmd() {    date '+%H:%M:%S'}并将函数调用为cmdPOSIXsh没有数组,所以最接近的就是在位置参数中建立一个元素列表。这是一个POSIXsh运行邮件程序的方法# POSIX sh# Usage: sendto subject address [address ...]sendto() {     subject=$1     shift     first=1     for addr; do         if [ "$first" = 1 ]; then set --; first=0; fi         set -- "$@" --recipient="$addr"     done     if [ "$first" = 1 ]; then         echo "usage: sendto subject address [address ...]"         return 1     fi     MailTool --subject="$subject" "$@"}注意,这种方法只能处理没有重定向的简单命令。它不能处理重定向、管道、for/while循环、if语句等

斯蒂芬大帝

var=$(echo&nbsp;"asdf")echo&nbsp;$var#&nbsp;=>&nbsp;asdf使用此方法,将立即计算该命令并存储其返回值。stored_date=$(date)echo&nbsp;$stored_date#&nbsp;=>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;10:57:16&nbsp;EST&nbsp;2015#&nbsp;(wait&nbsp;a&nbsp;few&nbsp;seconds)echo&nbsp;$stored_date#&nbsp; =>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;10:57:16&nbsp;EST&nbsp;2015背勾也一样stored_date=`date`echo&nbsp;$stored_date#&nbsp;=>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;11:02:19&nbsp;EST&nbsp;2015#&nbsp;(wait&nbsp;a&nbsp;few&nbsp;seconds)echo&nbsp;$stored_date#&nbsp; =>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;11:02:19&nbsp;EST&nbsp;2015在$(...)将不会在以后对其进行评估。stored_date=$(eval&nbsp;"date")echo&nbsp;$stored_date#&nbsp;=>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;11:05:30&nbsp;EST&nbsp;2015#&nbsp;(wait&nbsp;a&nbsp;few&nbsp;seconds)echo&nbsp;$stored_date#&nbsp; =>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;11:05:30&nbsp;EST&nbsp;2015使用val时,将在下列情况下对其进行计算eval使用stored_date="date"&nbsp;#&nbsp;<&nbsp;storing&nbsp;the&nbsp;command&nbsp;itselfecho&nbsp;$(eval&nbsp;"$stored_date")#&nbsp;=>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;11:07:05&nbsp;EST&nbsp;2015#&nbsp; (wait&nbsp;a&nbsp;few&nbsp;seconds)echo&nbsp;$(eval&nbsp;"$stored_date")#&nbsp;=>&nbsp;Thu&nbsp;Jan&nbsp;15&nbsp;11:07:16&nbsp;EST&nbsp;2015#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;^^&nbsp;Time&nbsp;changed在上面的示例中,如果需要运行带有参数的命令,请将它们放在要存储的字符串中。stored_date="date&nbsp;-u"#&nbsp;...对于bash脚本,这很少相关,但最后一个注意事项。小心eval..只有您控制的字符串,而不是来自不受信任用户的字符串或从不受信任的用户输入生成的字符串。
随时随地看视频慕课网APP
我要回答