tar*_*ius 9 bash whitespace arguments
在bash中,可以转义包含空格的参数.
foo "a string"
Run Code Online (Sandbox Code Playgroud)
这也适用于命令或函数的参数:
bar() {
foo "$@"
}
bar "a string"
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,但是如果我想在调用之前操纵参数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
Run Code Online (Sandbox Code Playgroud)
那么当参数包含空格时,如何构建参数列表?
tar*_*ius 20
有(至少)两种方法可以做到这一点:
使用数组并使用"${array[@]}"以下命令展开它:
bar() {
local i=0 args=()
for arg in "$@"
do
args[$i]="prefix $arg"
((++i))
done
foo "${args[@]}"
}
Run Code Online (Sandbox Code Playgroud)
所以我们学了什么?"${array[@]}"是${array[*]}什么"$@"是$*.
或者,如果您不想使用数组,则需要使用eval:
bar() {
local args=()
for arg in "$@"
do
args="$args \"prefix $arg\""
done
eval foo $args
}
Run Code Online (Sandbox Code Playgroud)这是一个较短的版本,不需要使用数字索引:
(示例:构建命令的参数find)
dir=$1
shift
for f in "$@" ; do
args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"
Run Code Online (Sandbox Code Playgroud)