将多个单词命令作为变量运行

时间:2013-08-15 05:56:14

标签: bash shell command-line

我从文件中获取了一些命令,如果它们满足某些条件,它们就会运行。 假设从文件中读取的命令是$command

...
if [ $doCmd -eq 1 ]
then
   $command
   doCmd=0
   break
fi
...

脚本可以使用ls这样的单字命令。但是,ls -lecho "test"等多个单词命令会导致此错误:

x.sh: line x: ls -l: command not found

实现目标的正确途径是什么?感谢。

2 个答案:

答案 0 :(得分:0)

报价帮助。

这是终端中的一个示例,您可以从此处获取它以使其在脚本中工作:

$ c='ls -l'
$ $c
total 168
drwx------+   4 ray  staff    136 Aug  3 14:27 Desktop
drwx------+  11 ray  staff    374 Jul 17 15:56 Documents
.
.
.

答案 1 :(得分:0)

如果你的shell没有使用IFS在open中拆分变量,$ command将不会扩展为两个aguments(ls和-l),它们会将“ls -l”解释为命令本身的单个名称。如果您正在使用bash,则可以使用数组。并且将变量放在引号周围总是好的:

command=(ls -l)
if [ "$doCmd" -eq 1 ]
then
   "${command[@]}"
   doCmd=0
   break
fi

还有更好的条件表达式:

if [[ doCmd -eq 1 ]]

或条件算术:

if (( doCmd == 1 ))

Eval实际上可以是一个选项,但它很危险,因为它不仅仅是重新表达命令,而且还包括shell的一般语法。

if [ "$doCmd" -eq 1 ]
then
   eval "$command"
   doCmd=0
   break
fi