变量未被EOF内部拾取

时间:2017-11-29 11:24:29

标签: shell unix aix

我正在尝试通过SSH远程运行命令,但是在EOF中定义的变量没有被提取。

变量$BASE_PATH未在另一个我按名称FOLDER_NAME定义的变量中调用。内部脚本也提到过。 我无法在单引号(EOF)中使用'EOF',因为我也必须使用退出shell的变量。

#!/usr/bin/ksh

FILE_NAME=$2
jvm_list=$1

for jvm in `echo $jvm_list`
do

ssh $jvm << EOF
    echo FILE_NAME=${FILE_NAME}
    export BASE_PATH="\${WEB_DOMAIN_HOME}/Server";
    echo BASE_PATH=\${BASE_PATH};            ##Value of BASE_PATH is getting picked up##
    export FOLDER_NAME=\`ls -1d $"{BASE_PATH}"/properties* | grep -i -v old\`  ##Value of BASE_PATH is coming blank here##
    echo $FOLDER_NAME
EOF

done

1 个答案:

答案 0 :(得分:1)

<< EOF开头的构造就像双引号字符串一样,因此美元符号在其中是特殊的,除非转义。

在这里,您转义了$,因此最终由ssh启动的shell会评估该变量

echo BASE_PATH=\${BASE_PATH};    ##Value of BASE_PATH is getting picked up##

在这里,你没有逃脱它,所以评估发生在外壳:

export FOLDER_NAME=\`ls -1d $"{BASE_PATH}"/properties* ...\`  

我也怀疑那里的引号是错位的。在Bash中$".." is a locale-specific translation,以及seems to be the same in ksh。你可能没有翻译,所以字符串应该按原样返回:{BASE_PATH}

与此有些相关可能是反引号,因为它们也需要引用。您可以使用$( ... )形式的命令替换,因此您只需要考虑$

我认为这可能是你想要的:

ssh "$jvm" << EOF
    export FOLDER_NAME=\$(ls -1d "\${BASE_PATH}"/properties* | grep -i -v old)  
EOF

完整性检查:

$ foo=out; bash <<EOF
> foo=in; echo $foo
> EOF
out

$ foo=out; bash <<EOF
> foo=in; echo \$foo
> EOF
in