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"
我是 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"