Bash:意外标记“else”附近的语法错误,使用 ssh 的 grep 终端

Bash: syntax error near unexpected token `else', grep termin using ssh

我是 bash 的新手,所以这可能是一个简单的修复。我正在尝试编写一段代码,让我可以检查不同服务器上的作业何时完成。这是我得到的当前代码块。

#!/bin/bash

boxes=(dm virgil alpha kolp law be corn zira)
Cyan='3[0;36m'
NC='3[0m' # No Color
for box in "${boxes[@]}"; do
    echo ""
    echo -e "${Cyan}${box}${NC}"
    ssh "${box}" "ls -ltr | tail -n 11 | tr -s ' ' | cut -d ' ' -f 6- "
done

echo "------------------------------------------------------------------------------"

这工作正常,并给出以下输出。

dm
Jan 13 08:47 Model_SNAr_smallbasisset_TCM.chk
Jan 14 09:57 Phoscat_SS_regioazid_subopt.com
Jan 14 09:57 Phoscat_SS_regioazid_subopt.log
Jan 14 09:57 Phoscat_SS_regioazid_subopt.csh
Jan 14 09:57 nohup.out
Feb 4 17:57 Model_SNAr_smallbasisset_wb97xd_sm.com
Feb 4 17:57 Model_SNAr_smallbasisset_b3lyp_sm.com
Feb 4 17:57 Model_SNAr_medbasisset_b3lyp_sm.com
Feb 4 17:58 Model_SNAr_smallbasisset_wb97xd_fp.com
Feb 4 17:58 Model_SNAr_smallbasisset_b3lyp_fp.com
Feb 4 17:58 Model_SNAr_medbasisset_b3lyp_fp.com

如您所见,这显示了所有文件,而我想将其缩小到仅某些文件扩展名,并且有效 "grep termin [filename]" 以确定作业是否已正常完成。目前我的脚本将显示所有已创建但不一定已完成的文件。

通过改变

"ls -ltr | ..."

"ls -ltr *.log *.out |"

我可以有选择地搜索文件扩展名,但是我在目录中没有任何该扩展名的文件,我得到以下看起来很乱的文件,我想删除。

zira
ls: cannot access *.log: No such file or directory
ls: cannot access *.out: No such file or directory

为了解决这个问题,我尝试使用 if..else 语句,但出现了以下错误。

#!/bin/bash

DIR="/$HOME"
boxes=(dm virgil alpha kolp law be corn zira)
Cyan='3[0;36m'
NC='3[0m' # No Color
for box in "${boxes[@]}"; do
    ssh "${box}"
    if [ "$(ls -A $DIR)" ]; then
        for box in "${boxes[@]}"; do
            echo ""
            echo -e "${Cyan}${box}${NC}"
            ssh "${box}" "ls -ltr *.log *.out | tail -n 11 | tr -s ' ' | cut -d ' ' -f 6-"
    else
        echo ""
        fi

done

echo "------------------------------------------------------------------------------"


line 14: syntax error near unexpected token `else'
line 14: `    else'

我是否遗漏了一些简单的东西,我将如何合并 "grep termin" 风格的命令?

谢谢,

卡路里

for 缺少结束符 done(应该在 else 之前)

如果像 *.log 这样的通配符模式不匹配任何内容,shell 将 return 文字字符串 “*.log”。您可以显式测试该字符串。但是更简洁的方法是使用

    shopt -s nullglob; ls *.log

改变 shell 的行为。然后没有匹配的模式将被简单地抑制,这就是你想要的。

老版本的Bourneshell不支持shopt,但还是可以测试下通配符的结果是否为"*.log"