在bash中,可以转义包含空格的参数。
foo "a string"
这也适用于命令或函数的参数:
bar() {
foo "$@"
}
bar "a string"
到目前为止一切顺利,但如果我想在调用foo
之前操纵参数怎么办?
这不起作用:
bar() {
for arg in "$@"
do
args="$args \"prefix $arg\""
done
# Everything looks good ...
echo $args
# ... but it isn't.
foo $args
# foo "$args" would just be silly
}
bar a b c
那么当参数包含空格时,如何构建参数列表?
答案 0 :(得分:16)
至少有两种方法可以做到这一点:
使用数组并使用"${array[@]}"
展开
bar() {
local i=0 args=()
for arg in "$@"
do
args[$i]="prefix $arg"
((++i))
done
foo "${args[@]}"
}
那么,我们学到了什么? "${array[@]}"
${array[*]}
"$@"
与$*
的对象是eval
。
或者,如果您不想使用数组,则需要使用bar() {
local args=()
for arg in "$@"
do
args="$args \"prefix $arg\""
done
eval foo $args
}
:
{{1}}
答案 1 :(得分:4)
这是一个较短的版本,不需要使用数字索引:
(例如:构建find
命令的参数)
dir=$1
shift
for f in "$@" ; do
args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"
答案 2 :(得分:2)
使用arrays(Bash中hidden features之一)。
答案 3 :(得分:0)
您可以按照建议使用数组,并更改细节。调用foo的行应该是
foo "${args[@]}"
答案 4 :(得分:0)
我也有这个问题。我正在编写一个bash脚本来备份我的Windows计算机上的重要文件(cygwin)。我也尝试了阵列方法,但仍然存在一些问题。我不确定我是如何修复它的,但这里是我的代码中很重要的部分,以防它对你有所帮助。
WORK="d:\Work Documents\*"
# prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
echo "Add $x to archive? (y/n)"
read DO
if [ "$DO" == "y" ]; then
echo "compressing $x"
7zip a $W_OUTPUT "$x"
fi
echo ""
done