String BourneShell:使用包含字符串和空格的环境变量作为外部可执行文件的参数——可能吗?

String BourneShell:使用包含字符串和空格的环境变量作为外部可执行文件的参数——可能吗?,string,parameters,environment-variables,spaces,sh,String,Parameters,Environment Variables,Spaces,Sh,这是一个一般性的问题,因为“问题”已经出现了很多次,我一直无法回避,我想知道这是否真的是不可能的 问题涉及BOURNE shell脚本(不是Bash)以及是否可以使用其值包含包含空格的字符串的环境变量 请考虑一个简单的例子来说明这个问题—— 运行脚本时,内部引号被解释为文字字符,而不是字符串分隔符 sh -x test + parameters=-T "XXX YYY ZZZ" + /usr/bin/xterm -T "XXX YYY" /usr/bin/xterm: No absolute

这是一个一般性的问题,因为“问题”已经出现了很多次,我一直无法回避,我想知道这是否真的是不可能的

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

请考虑一个简单的例子来说明这个问题——

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

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作为title参数,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...`
强制shell重新分析任何内容…yadda。。。就像您键入的一样。

请尝试以下操作:

parameters='-T "XXX YYY ZZZ"'
eval `echo /usr/bin/xterm ${parameters}`
注意这里的背景标记。这个成语:

eval `echo ...yadda...`

强制shell重新分析任何内容…yadda。。。好像是您键入的。

谢谢!这就解决了我的问题。另外,如果我使用引号嵌套来保留至少一级引号,我可以将字符串作为参数传递给执行
echo命令${parameter}
的函数,并且它不会抱怨。我以前使用过eval/echo来扩展变量中的变量,但没有想过要用它来保留空格。谢谢!这就解决了我的问题。另外,如果我使用引号嵌套来保留至少一级引号,我可以将字符串作为参数传递给执行
echo命令${parameter}
的函数,并且它不会抱怨。我以前使用过eval/echo来扩展变量中的变量,但并没有想过要用它来保留空格。