正确保留bash中的引号

时间:2013-08-09 14:06:44

标签: bash shell quoting

我正在尝试将参数从bash脚本传递给可执行文件,其中一个包含空格。我一直在寻找如何解决这个问题,但我找不到正确的方法来解决这个问题。使用名为first的脚本和名为second的脚本的最小示例。

第一个脚本:

#!/bin/bash
# first script
ARGS="$@"
./second $ARGS

第二个脚本:

#!/bin/bash
# second script
echo "got $# arguments"

现在,如果我像这样运行它,我会得到以下结果:

$ ./first abc def
got 2 args
$ ./first "abc def"
got 2 args
$ ./first 'abc def'
got 2 args

我怎样才能这样做,第二个脚本也只收到一个参数?

2 个答案:

答案 0 :(得分:4)

你不能使用中间变量。如果你引用它将总是传递1个参数,如果你不这样,你将丢失引号。

但是,如果不使用如下变量,则可以直接传递参数:

./second "$@"

$ ./first abc def
got 2 arguments
$ ./first "abc def"
got 1 arguments

或者,您可以使用数组来存储这样的参数:

#!/bin/bash
# first script
ARGS=("$@")
./second "${ARGS[@]}"

答案 1 :(得分:0)

IFS是你的朋友。

#!/bin/bash
# first script
ARGS="$@"
IFS=$(echo -en "\n\b")
./second $ARGS

IFS代表内部字段分隔符...