我有一个bash脚本:
function run_cmd
{
CMD="$@"
echo ">>> $CMD"
exec $CMD
}
CLUSTERS_PKG="abc1, abc2"
# run command
run_cmd "package upload -c '$CLUSTERS_PKG'"
但是,当我运行此命令时,我的'package'命令会出现使用错误。如果我使用复制+粘贴运行命令,它可以正常工作。
它似乎不喜欢我在$ CLUSTERS_PKG变量中传递空格和引号。如何正确运行传递给run_cmd的“一切”没有shell破坏东西?
答案 0 :(得分:1)
您可以使用BASH ARRAYS:
function run_cmd
{
arr=( "$@" )
echo ">>> ${arr[@]}"
exec "${arr[@]}"
}
答案 1 :(得分:1)
请务必阅读the link posted by Adrian Frühwirth。这个答案实际上只是对那里建议的简短总结。
如果你传递这样的论点:
run_cmd "package upload -c '$CLUSTERS_PKG'"
然后您必须在函数中使用eval
,以便将单引号视为引用运算符:
run_cmd () {
CMD="$@"
echo ">>> $CMD"
eval "$CMD"
}
如果您传递这样的参数:
run_cmd package upload -c "$CLUSTERS_PKG"
然后你可以在你的函数中使用一个数组(比使用eval
更安全):
run_cmd () {
CMD=( "$@" )
echo ">>> ${CMD[@]}"
"${CMD[@]}"
}
您真的需要才能使用exec
;事实上,您可能不会这样做,因为这会导致当前流程被CMD
替换:您不会在run_cmd
之后返回到调用$CMD
的shell退出。