通过shell变量传递包含空格的参数

3
我有一个程序,想要通过传递来自Shell变量的参数来调用它。在本问题中,我假设它是这样给出的:
#!/bin/sh
echo $#

即打印出传递给它的参数数量。我们称其为count-args

我这样调用我的程序:

X="arg1 arg2"
count-args $X

这个方法很有效。但现在我的一个参数中有空格,我找不到转义它的方法。例如,以下内容都不可用:

X="Hello\ World"
X="Hello\\ World"
X="'Hello World'"

在所有这些情况下,我的程序count-args都会打印出2。我想找到一种方法,使我能够传递字符串Hello World并返回1而不是2。怎么办? 仅供澄清:我不想将所有参数作为单个字符串传递,例如:
X="Hello World"
count-args $X

应该打印出2。我想要一种传递包含空格的参数的方法。


你自相矛盾。X="Hello World"; count-args $X应该打印出1。为了实现这一点,请按照user1934428所示使用引号:"$X"。如果您希望将此单个字符串解释为多个参数,则做法是错误的:http://mywiki.wooledge.org/BashFAQ/050! - dekkard
@dekkard:既然我已经找到了实现我想要的功能的方法,我对我的需求是非常确信的。不过还是谢谢你提供的链接,非常有帮助。 - Markus Mayr
4个回答

3
使用数组存储多个包含空格的参数。
$ args=("first one" "second one")
$ count-args "${args[@]}"
2

3
这可以通过使用xargs来解决。通过替换
count-args $X

使用

echo $X | xargs count-args

我可以使用反斜杠来转义$X中的空格,例如:

X="Hello\\ World"
echo $X | xargs count-args

打印出1和

X="Hello World"
echo $X | xargs count-args

打印出2。


2
 count-args "$X"

引号在bash中确保变量X的整个内容作为单个参数传递。

值得注意的是,这不需要对 Xvalue 进行任何特殊处理:X="Hello World"X 设置为一个包含空格的字符串,而 count-args "$X" 调用该函数并传入一个参数。您还需要在函数内部引用 $1 的扩展以保留空格。 - chepner
我认为这不是我想要的。我不想将所有参数作为单个字符串传递。我想要一种传递包含空格的参数的方法。我在我的问题中添加了一个段落。我希望现在更清晰了。 - Markus Mayr

1
您的计数脚本:

$ cat ./params.sh
#!/bin/sh
echo $#

为了完整起见,以下是不同参数的情况:

$ ./params.sh
0
$ ./params.sh  1 2
2
$ ./params.sh
0
$ ./params.sh 1
1
$ ./params.sh 1 2
2
$ ./params.sh "1 2"
1

下面是使用变量得到的结果:

$ XYZ="1 2" sh -c './params.sh $XYZ'
2
$ XYZ="1 2" sh -c './params.sh "$XYZ"'
1

将其翻译成中文:

再深入一点:

。保留HTML,不解释。
$ cat params-printer.sh
#!/bin/sh
echo "Count: $#"
echo "1 : '$1'"
echo "2 : '$2'"

我们得到:
$ XYZ="1 2" sh -c './params-printer.sh "$XYZ"'
Count: 1
1 : '1 2'
2 : ''

这看起来像是你想做的事情。现在,如果你有一个无法控制的脚本,也无法控制脚本的调用方式。那么,很少有办法可以防止带空格的变量变成多个参数。 StackOverflow 上有很多关于这个问题的提问表明,你需要能够控制命令的调用方式,否则你几乎无能为力。并且哇!这个问题已经被问了很多次了: 传递带有空格的参数(bash)脚本 将带有空格的字符串作为 bash 函数参数传递 在 Bash 脚本中传递带有空格的参数到命令如何将带有空格的参数传递给 shell 脚本函数

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