我正在尝试运行一个 shell 脚本来计算每个文件中的行数,如果行数 < 2,我需要将其移动到不同的目录。
壳:
#!/bin/bash
foreach i in (ls *.DAT)
a=`wc -l $i`
if $a=<2 then
mv $i aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup
endif
end
但我的 shell 出现错误:
igud_to_backup.sh:第 8 行:意外标记“(”附近出现语法错误
igud_to_backup.sh:第 8 行:`foreach i in (ls *.DAT)'
shell脚本有什么问题?
答案1
存在很多问题:
foreach
不是 bash 关键字:使用for
- 如果您想执行命令,请使用
$( ... )
而不仅仅是括号 - 括号中的命令不需要执行,可以使用 shell 扩展
for i in *.DAT; do
(一般参见为什么*不*解析`ls`?) - 测试某个值是否小于或等于(请参阅
man test
):if [ $a -le 2 ] ; then
- a以and not
for
结尾done
end
- an 的
if
结尾是fi
and notendif
- 如果您将文件名作为参数给出
wc
它将打印行数和文件名。用于从标准输入<
读取wc
总结:
#!/bin/sh
for i in *DAT; do
a=$( wc -l < "$i" )
if [ "$a" -le 2 ] ; then
mv "$i" aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup
fi
done
答案2
正如 Matteo 提到的,您正在尝试使用 perl 语法。应该;
for i in $(ls *.DAT); do
if [ $(wc -l ${i}) -le 2 ]; then
mv ${i} /path/to/
fi
done