【问题标题】:Loop outputting blank variables - SSH Bash循环输出空白变量 - SSH Bash
【发布时间】:2013-09-11 08:58:35
【问题描述】:

我正在编写一个脚本来帮助我在家用电脑和服务器之间同步文件。我遇到的问题之一是,当我运行 for 循环时,它会输出空行。

其他一切似乎都很好,echo $REMOTE 按预期列出了所有文件及其完整路径。我尝试过取消引用、引用、将 EOF 从“EOF”更改为 EOF 等,但到目前为止没有任何效果。

下面是脚本:

function uploadDownload()
{
    if [ "$1" == "d" ]; then
        ssh -i ~/Dropbox/Business/aws/first.pem ubuntu@XXXX.194.202 << EOF
        echo $REMOTE

        for file in $REMOTE; do
            echo $file
        done
EOF
        #scp -r -i ~/Dropbox/Business/aws/first.pem ubuntu@XXXX.194.202:$REMOTE $LOCAL
    elif [ "$1" == "u" ]; then
        scp -r -i ~/Dropbox/Business/aws/first.pem $LOCAL ubuntu@XXXX.194.202:$REMOTE
    fi
}


if [ "$2" == "m" ]; then

    if [ -z "$3" ]; then
        echo "Please enter the local location of the files and provide an absolute path..."
        read LOCAL
        echo "Please enter the remote location of the files..."
        read REMOTE
        uploadDownload
    else
        LOCAL=$2
        if [ -z "$4" ]; then
            REMOTE=$3
        else
            REMOTE='ubuntu@XXXX.194.202:~/test/'
        fi  
        uploadDownload
    fi
else
    LOCAL='/home/will/Dropbox/Business/aws/files/binaryhustle/'
    REMOTE='/home/ubuntu/dev/binaryhustle/*'
    uploadDownload $1
fi

编辑:根据建议,我编辑了 uploadDownload 函数。我还应该注意,我在循环外测试了echo "$REMOTE";,它什么也不返回(不像没有引号,它会返回一些东西)。

function uploadDownload()
    {
        if [ "$1" == "d" ]; then
            ssh -i ~/Dropbox/Business/aws/first.pem ubuntu@54.252.194.202 << EOF
    for file in "/home/ubuntu/dev/binaryhustle"; do
    echo $file
    done
    EOF
            #scp -r -i ~/Dropbox/Business/aws/first.pem ubuntu@54.252.194.202:$REMOTE $LOCAL
        elif [ "$1" == "u" ]; then
            scp -r -i ~/Dropbox/Business/aws/first.pem $LOCAL ubuntu@54.252.194.202:$REMOTE
        fi
    }

【问题讨论】:

    标签: bash shell ubuntu ssh


    【解决方案1】:

    感谢@konsolebox 让我走到了一半,我通过在文件中添加斜杠来让它工作,但是这不适用于

    function uploadDownload()
    {
        if [ "$1" == "d" ]; then
                ssh -i ~/Dropbox/Business/aws/first.pem ubuntu@54.252.194.202 <<EOF
    for file in "$REMOTE"; do
    echo \$file
    done
    EOF
                #scp -r -i ~/Dropbox/Business/aws/first.pem ubuntu@54.252.194.202:$REMOTE $LOCAL
            elif [ "$1" == "u" ]; then
                scp -r -i ~/Dropbox/Business/aws/first.pem $LOCAL ubuntu@54.252.194.202:$REMOTE
            fi
        }
    

    【讨论】:

    • 您是否尝试不缩进分隔符EOF?。此外,由于您这次引用了 $REMOTE ("$REMOTE"),它只会扩展为一个单词。我之前可能建议引用您的变量,但不是为您真正打算使用分词处理的变量。 (编辑:数组不适用于那个。删除了一个添加的注释。)
    • 请告诉我们为什么它仍然不起作用,以及什么 mod 实际起作用。我是在你使用 &lt;EOF 时阅读的?
    • 是的,分隔符没有缩进,删除 <<EOF 而不是&lt;&lt; EOF
    【解决方案2】:

    您可能想看看unison。其强大的文件同步工具能够通过 ssh 工作。但它不会做任何内容差异。

    【讨论】:

    • 谢谢我实际上最终使用了 rsync。我会为其他人发布最终代码。
    【解决方案3】:

    尝试引用您的变量$file,因为它在发送到远程服务器之前已展开:

                echo $file
    

                echo \$file
    

    或者更好

                echo \"\$file\"
    

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      相关资源
      最近更新 更多