0

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

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

该脚本适用于单字命令,例如ls. 但是多个单词命令喜欢ls -lecho "test"导致此错误:

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

什么是实现的正确方法?谢谢。

4

2 回答 2

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
.
.
.
于 2013-08-15T06:01:00.387 回答
0

如果您的 shell 不使用 IFS 在打开时拆分变量,则 $command 不会扩展为两个参数(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
于 2013-08-15T06:31:09.033 回答