我有一个程序要通过从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
。我想要一种传递包含空格的参数的方法。
答案 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
哇!此已经多次被问过:
答案 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。