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

时间:2016-03-21 10:50:06

标签: bash shell parameter-passing sh

我有一个程序要通过从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。怎么样?

只是为了澄清:我不想将所有参数作为单个字符串传递,例如

X="Hello World"
count-args $X

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

4 个答案:

答案 0 :(得分:3)

使用数组存储多个包含空格的参数。

$ args=("first one" "second one")
$ count-args "${args[@]}"
2

答案 1 :(得分:2)

 count-args "$X"

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

答案 2 :(得分: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

更进一步:

$ 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上有很多问题表明你需要能够控制命令的调用方式,否则你几乎无法做到。

Passing arguments with spaces between (bash) script

Passing a string with spaces as a function argument in bash

Passing arguments to a command in Bash script with spaces

哇!此已经多次被问过

How to pass argument with spaces to a shell script function

答案 3 :(得分:1)

这可以通过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。