我正在尝试通过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
答案 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