尽管目录不为空,但使用 "for f in directory" 时变量名为空

  • 本文关键字:for in 变量名 directory 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正在拾取一些东西,因为有正确数量的空白行。但是,我希望解压缩我无法做到的每个文件。

蒂亚。

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

请记住,无论 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

最新更新