我的第一个 Shell 计算每个文件中的行数

我的第一个 Shell 计算每个文件中的行数

我正在尝试运行一个 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 notfor结尾doneend
  • an 的if结尾是fiand 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

相关内容