尽管目录为非空,但使用“ for目录中的f”时,变量名为空

时间:2019-06-17 10:04:29

标签: bash ssh

作为bash脚本的一部分,我通过SSH连接到远程计算机。导航到目录后,我运行ls确认已找到匹配的文件。但是,然后我尝试遍历文件并在文件上运行其他命令,该变量现在为空。

代码:

    echo "DOING STUFF!"
    cd /mnt/slowdata/ls8_processing
    ls
    for f in *.tar.gz
    do
        echo $f
    done

输出:

DOING STUFF!
LC080330242019031901T1-SC20190606111327.tar.gz
LC080330242019042001T1-SC20190606111203.tar.gz
LC080330242019052201T1-SC20190606111130.tar.gz
LC080330252019030301T2-SC20190606111021.tar.gz
LC080330252019031901T1-SC20190606120750.tar.gz
LC080340232019031001T1-SC20190606111056.tar.gz
LC080340232019041101T1-SC20190606111215.tar.gz
LC080340242019031001T1-SC20190606111201.tar.gz
LC080340242019041101T1-SC20190606111250.tar.gz
LC080340242019052901T1-SC20190606111331.tar.gz










从输出中可以看到,$ f正在拾取某些东西,因为空行数正确。但是,我希望解压缩无法执行的每个文件。

TIA。

1 个答案:

答案 0 :(得分:3)

您必须删除$的特殊含义,才能将它作为“ $”传递给远程主机,否则在将命令发送到远程主机之前,变量将被扩展。

请记住,无论CD是否成功,for循环都会运行。

ssh server1 << EOF
    cd /mnt/slowdata/ls8_processing
    ls
    for f in *.tar.gz
    do
        echo \$f
    done
EOF

我的示例显示了不同之处:

script.sh

#!/bin/bash

f=123

ssh -i .ssh/keyauth.pem root@server1 << EOF
for f in ./*.log 
do 
        echo "\$f"
        echo "$f" 
done 
EOF

输出

[edvin@server2 ~]$ ./script.sh
./sepap-install.log
123
./sepfl-upgrade.log
123
./sep-install.log
123
./sepjlu-install.log
123
./sepui-install.log
123