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"