在Shell脚本中连接命令字符串

4
我将维护一个现有的shell脚本,该脚本在内部将命令分配给一个变量,如下所示:

MY_COMMAND="/bin/command -dosomething"

然后在后续过程中,通过以下方式将“参数”传递给$MY_COMMAND:

MY_ARGUMENT="fubar"

$MY_COMMAND $MY_ARGUMENT

这个想法是让$MY_COMMAND在执行时附加上$MY_ARGUMENT。我不是shell脚本专家,但从我所知道的来看,$MY_COMMAND并没有把$MY_ARGUMENT作为参数执行。然而,如果我进行如下操作:

MY_ARGUMENT="itworks"
MY_COMMAND="/bin/command -dosomething $MY_ARGUMENT"

它工作得很好。

在shell脚本中调用$MY_COMMAND $MY_ARGUMENT这样的语法是有效的吗?这样可以使用MY_ARGUMENT作为参数在shell脚本中执行一个shell命令吗?


5
我试图将一个命令放入一个变量中,但复杂情况总是失败!(原文链接:http://mywiki.wooledge.org/BashFAQ/050) - user000001
当你说:“...但是从我所知道的来看,$MY_COMMAND不会以$MY_ARGUMENT作为参数执行。”时,你是在推测还是已经运行了一个失败的测试?实际上,它($MY_COMMAND $MY_ARGUMENT)应该可以工作,这取决于你的上下文。 - lurker
@mbratch:是的,我运行了它,但是它没有按照$MY_COMMAND $MY_ARGUMENT的格式工作,基本上命令没有执行。我想我可以将STDERR重定向到STDOUT并捕获日志。 - Engineer2021
1
我使用了这种技术进行了简单的测试,它起作用了。例如,在shell提示符下,如果我设置了FOO=lsBAR="*.c",那么输入$FOO $BAR会列出当前目录中的.c文件。因此,您需要分享它失败的上下文。 - lurker
2个回答

5

使用Bash,您可以使用数组:

MY_COMMAND=("/bin/command" "-dosomething")  ## Quoting is not necessary sometimes. Just a demo.
MY_ARGUMENTS=("fubar")  ## You can add more.

"${MY_COMMAND[@]}" "${MY_ARGUMENTS[@]}"  ## Execute.

3
它的工作方式与您预期的一样,但 fubar 将成为第二个参数($2),而不是$1
因此,如果您在/bin/command中使用echo参数,您将得到如下内容:
echo "$1" # prints '-dosomething'
echo "$2" # prints 'fubar'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接