作为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。
答案 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