Linux/Unix的Bash foreach循环示例

时间:2020-01-09 10:37:22  来源:igfitidea点击:

我在Unix操作系统和csh shell循环上使用过foreach。
如何在Linux上运行的bash shell中使用foreach循环?

Cshell(csh)或改进版本tcsh是1970年代后期的Unixshell。

csh foreach循环语法如下:

foreach n ( 1 2 3 4 5 )
  #command1
  #command2
end

但是,bash缺少foreach语法。
相反,您可以使用bash while循环或bash进行循环语法,如下所述。

Bash foreach循环示例

假设您要转换以下csh forloop示例:

foreach i ( * )
echo "Working $i filename ..."
end

在csh或tcsh foreach上方,使用循环显示了文件列表。
这是bash shell中的类似代码:

for i in *
do
  echo "Working on $i file..."
done

但是,可以使用find命令查找并安全地处理包含换行符,空格和特殊字符的文件名。

## tested on GNU/Linux find ##
## and bsd/find only ##
find /dir/ -print0 | xargs -r0 command
find /tmp/test -print0 | xargs -I {} -r0 echo "Working on "{}" file ..."
find /tmp/test -type f -print0 | xargs -I {} -r0 echo "Working on '{}' file ..."
Working on '/tmp/test' file ...
Working on '/tmp/test/hosts.deny' file ...
Working on '/tmp/test/My Resume.pdf' file ...
Working on '/tmp/test/hostname' file ...
Working on '/tmp/test/hosts.allow' file ...
Working on '/tmp/test/Another   file     name.txt' file ...
Working on '/tmp/test/resolv.conf' file ...
Working on '/tmp/test/hosts' file ...
Working on '/tmp/test/host.conf' file ...

如何在bash shell中使用foreach

假设您有一个名为lists.txt的文件,如下所示:

cat lists.txt

输出示例:

/nfs/db1.dat
/nfs/db2.dat
/nfs/share/sales.db
/nfs/share/acct.db 
/nfs/private/users.db
/nfs/private/payroll.db

每个文件都在Unix或Linux服务器上有一个文件。
这是读取lists.txt文件并处理lists.txt中列出的每个文件的方法:

for n in $(cat lists.txt )
do
    echo "Working on $n file name now"
    # do something on $n below, say count line numbers
    # wc -l "$n"
done

尽管for循环似乎易于使用来读取文件,但它仍有一些问题。
在Linux或Unix中,请勿尝试用于逐行读取文件。
而是使用while循环,如下所示:

#!/bin/bash
## path to input file 
input="lists.txt"
 
## Let us read a file line-by-line using while loop ##
while IFS= read -r line
do
  printf 'Working on %s file...\n' "$line"
done < "$input"