bash - 尽管目录为非空,但使用 “for f 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正在拾取某些东西,因为空行数正确。但是,我希望解压缩无法执行的每个文件。

TIA。

最佳答案

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

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

关于bash - 尽管目录为非空,但使用 “for f in directory”时,变量名为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629023/

相关文章:

xml - 如何对 html 和 xml 进行拼写检查?

java - Ganymed SSH - 更改用户

macos - 如何在 SSH 时获得 ZSH 提示

git - gitlab如何防止ssh作为用户git

java - JSch 多个隧道/跳跃站

bash - 如何将每个文件分别压缩到一个文件夹中,然后如果成功则删除原始文件

bash - 进程替换为 grep 缺少预期输出

bash - 在 Bash 中通过管道运算符重定向两个命令的输入

java - 从 java 捕获 ssh 命令输出

linux - 如何在 Linux bash shell 中转义 bang (!) 字符?