shell编程 - 如何在函数内正确传递变量

时间:2016-10-29 03:42:54

标签: bash shell unix

我的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仅适用。

1 个答案:

答案 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