Bash foreach loop examples for Linux / Unix

I used foreach on a Unix operating system and csh shell loop. Now, I am a Linux operating system. How do I use foreach loop in bash shell running on Linux?

The C shell (csh) or the improved version, tcsh is a Unix shell from the late 1970s. The csh foreach loop syntax is as follows:

foreach n ( 1 2 3 4 5 )

However, bash lacks foreach syntax; instead, you can use bash while loop or bash for loop syntax as described below.

Bash foreach loop examples

Let us say you want to convert the following csh forloop example:

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

Above csh or tcsh foreach displayed a list of files using loop. Here is similar code in a bash shell:

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

However, one can find and safely handle file names containing newlines, spaces, special characters using the find command

## 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 ...

Howto use foreach in bash shell

Say you have a file named lists.txt as follows:
cat lists.txt
Sample outputs:


Each in there is a file located on your Unix or Linux server. Here is how to read lists.txt file and work on each file listed in lists.txt:

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

Although for loop seems easy to use for reading the file, it has some problems. Don’t try to use “for” to read file line by line in Linux or Unix. Instead, use while loop as follows:

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

🐧 Please support my work on Patreon or with a donation.
🐧 Get the latest tutorials on Linux, Open Source & DevOps via:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
1 comment… add one
  • Jay Aug 18, 2020 @ 19:05

    How would one do that example command on a single line command in MacOS’ terminal? Tried remove the line breaks and tabs and then it becomes non-functional. Tried adding some \newline s even and it still didn’t work.

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre> for code samples. Problem posting comment? Email me @