我的bash脚本出了什么问题?我正在尝试在函数中传递位置参数。我的上一次测试 - Test 4
有效,但它基本上是我在命令行上运行的命令,没有变量替换。
我想打电话给我。有人可以告诉我,我的前3个测试的构造是否有效以及如何纠正它们?谢谢!
执行:./myscript.sh dev01 tester
#!/bin/bash
set +x
if [[ $# != 2 ]]; then
echo "Usage: ./script.sh <ENV> <COMPONENT>"
exit 1
fi
# Setup VARS
CREDS="-x foobar -a ec2.local_ipv4"
ENVIRONMENT="$1"
ROLES="$2"
function deploy {
knife ssh "$CREDS" "chef_environment:"$ENVIRONMENT" AND roles:*"$ROLES"*" "uname"
}
echo "Test 1"
deploy
echo "Test 2"
DEPLOY=$(knife ssh "$CREDS" "chef_environment:"${ENVIRONMENT}" AND roles:*"${ROLES}"*" "uname")
$DEPLOY
echo "Test 3"
knife ssh "$CREDS" "chef_environment:"$ENVIRONMENT" AND roles:*"$ROLES"*" "uname"
echo "Test 4"
knife ssh -x foobar -a ec2.local_ipv4 "chef_environment:dev01 AND roles:*tester*" "uname"
同样,Test 4
仅适用。
答案 0 :(得分:2)
您的问题与使用功能无关;它与您如何在变量中存储参数以及稍后使用该变量有关:
如果要将多个参数存储在(非数组)变量中,则不能引用该变量双引号,因为然后将该值作为单个参数传递给目标实用程序。
立即修复将使用$CREDS
不加引号,但这会使该值受到可能不受欢迎的shell expansions的影响,因此强大的方式传递多个参数是使用数组:
# Store args. individually as array elements
CREDS=( '-x' 'foobar' '-a' 'ec2.local_ipv4' )
# ...
# "${CREDS[@]}" passes the elements of the array safely as *individual*
# arguments.
knife ssh "${CREDS[@]}" "chef_environment:$ENVIRONMENT AND roles:*$ROLES*" "uname"
另请注意我是如何直接在双引号字符串中嵌入$ENVIRONMENT
和$ROLES
变量引用,这也使命令更加健壮。
最后,最好不要使用全大写的shell变量名以便avoid conflicts with environment variables and special shell variables。