BOURNE shell:使用包含带空格的字符串的环境变量作为外部执行程序的参数——这是可能的吗



这是一个通用问题,因为"问题"已经出现了很多次,我一直无法解决它,我想知道这是否真的不可能。

问题涉及BOURNE shell脚本(而不是Bash),以及是否可以使用其值包含包含空格的字符串的环境变量。

因此,考虑一个简单的案例来说明这个问题——

#! /bin/sh
parameters='-T "XXX YYY ZZZ"'
/usr/bin/xterm ${parameters}
exit 0

运行脚本时,内部引号被解释为文字字符,而不是字符串分隔符。

sh -x test
+ parameters=-T "XXX YYY ZZZ"
+ /usr/bin/xterm -T "XXX YYY"
/usr/bin/xterm: No absolute path found for shell: YYY"

xterm将-T"XXX"视为标题参数,将YYY"视为要使用的shell的下一个参数。

我尝试过颠倒引号、反斜杠的嵌套顺序,甚至删除引号,只在空格上使用反斜杠,即

sh -x test
+ parameters=-T XXX YYY
+ /usr/bin/xterm -T XXX YYY
/usr/bin/xterm: No absolute path found for shell: YYY

但什么都不管用。

如果标题字符串不包含空格,则没有问题,例如

#! /bin/sh
parameters='-T "the_title"'
/usr/bin/xterm ${parameters}

如果可能的话,我想让它发挥作用的一个原因是将变量用作shell脚本函数的参数,否则它将意味着多个参数。在这种情况下,它意味着一个用于命令行标志(-T),一个用于指令行参数值(标题字符串)。

那么,在环境变量中的字符串中是否可以有空格作为参数传递给可执行文件,或者不在BOURNE shell脚本中,通过某种方式使空格在变量展开时不被视为命令行参数分隔符?

试试这个:

parameters='-T "XXX YYY ZZZ"'
eval `echo /usr/bin/xterm ${parameters}`

请注意后面的记号。这个成语:

eval `echo ...yadda...`

迫使外壳重新分析。。。亚达。。。就像你键入的一样。

最新更新