我的bash脚本中有一些不一致的行为。 有变量,并且所有变量都赋值给它们,我通过回显脚本开头的值来确认它们。
但是,将它们传递给远程SSH会话时,一个变量具有值,而另一个变量显示为空白。我很确定我没有覆盖变量的值。
var s1 = "My String";
s1.endsWith("ring"); // returns true;
s1.endsWith("deez"); //returns false;
因此,# Script input arguments
USER=$1
SERVER=$2
# Other vars
PFX=$8
#
ADDRESS=$USER@$SERVER
function run {
ssh $ADDRESS /bin/bash $@
}
# Script body, some stuff happens here
run << "SSHCONNECTION2"
sudo mv "/home/$USER/$PFX" "/home/$USER/certs/"
SSHCONNECTION2
的输出是
错误03-Jan-2017 17:20:39 mv:无法移动&#39; / home / admin /&#39;到自己的子目录,&#39; / home / admin / certs / admin&#39;
有人能给我一个暗示我做错了什么吗? 谢谢。
答案 0 :(得分:1)
USER
有一个远程值,因为USER
总是有一个值:默认情况下,它是all POSIX systems上的当前用户帐户。为了避免与系统定义的变量名冲突,您应该为自己的shell和环境变量使用小写名称(前者是因为设置一个名称与环境变量重叠的shell变量将隐式覆盖后者)。
#!/bin/bash
# ^^^^ - not /bin/sh; printf %q (thus, eval-safe quoting) is a bash extension
user=$1
pfx=$8
# Tell the shell to quote your variables to be eval-safe!
printf -v user_q '%q' "$user"
printf -v pfx_q '%q' "$pfx"
# ...then you can use those eval-safe version in your heredoc
run << SSHCONNECTION2
# because the values are self-quoted, don't put their expansions inside quotes
sudo mv /home/$user_q/$pfx_q /home/$user_q/certs/
SSHCONNECTION2
注意:
SSHCONNECTION2
)故意不加引号以允许扩展。上面有点不幸,因为SSHCONNECTION2
heredoc的文字内容不是可以安全直接在shell中运行的代码。考虑this answer instead。