There are two types of bash for loops available. One using the “in” keyword with list of values, another using the C programming like syntax.
This article is part of our on-going bash tutorial series.
This explains both of the bash for loop methods, and provides 12 different examples on how to use the bash for loop in your shell scripts.
Bookmark this article for future reference, as this is the only article you would ever need to refer on how to use bash for loops with examples.
Method 1: Bash For Loop using “in” and list of values
Syntax:
for varname in list
do
command1
command2
..
done
In the above syntax:
for, in, do and done are keywords
“list” contains list of values. The list can be a variable that contains several words separated by spaces. If list is missing in the for statement, then it takes the positional parameter that were passed into the shell.
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
varname is any Bash variable name.
In this form, the for statement executes the commands enclosed in a body, once for each item in the list. For example, if the list of values contains 5 items, the for loop will be executed a total of 5 times, once for each item in the list. The current item from the list will be stored in a variable “varname” each time through the loop. This “varname” can be processed in the body of the for loop.
Method 2: Bash For Loop using C like syntax
The second form of the for loop is similar to the for loop in “C” programming language, which has three expressions (initialization, condition and updation).
for (( expr1; expr2; expr3 ))
do
command1
command2
..
done
In the above bash for command syntax,
Before the first iteration, expr1 is evaluated. This is usually used to initialize variables for the loop.
All the statements between do and done are executed repeatedly until the value of expr2 is TRUE.
After each iteration of the loop, expr3 is evaluated. This is usually used to increment a loop counter.
The following 12 examples shows how to bash for loops in different ways.
1. Static values for the list after “in” keyword
In the following example, the list of values (Mon, Tue, Wed, Thu and Fri) are directly given after the keyword “in” in the bash for loop.
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
$ cat for1.sh
i=1
for day in Mon Tue Wed Thu Fri
do
echo "Weekday $((i++)) : $day"
done
$ ./for1.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri
Caution: The list of values should not be separated by comma (Mon, Tue, Wed, Thu, Fri). The comma will be treated as part of the value. i.e Instead of “Mon”, it will use “Mon,” as value as shown in the example below.
$ cat for1-wrong1.sh
i=1
for day in Mon, Tue, Wed, Thu, Fri
do
echo "Weekday $((i++)) : $day"
done
$ ./for1-wrong1.sh
Weekday 1 : Mon,
Weekday 2 : Tue,
Weekday 3 : Wed,
Weekday 4 : Thu,
Weekday 5 : Fri
Caution: The list of values should not be enclosed in a double quote. (“Mon Tue Wed Thu Fri”). If you enclose in double quote, it will be treated as a single value (instead of 5 different values), as shown in the example below.
$ cat for1-wrong2.sh
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
i=1
for day in "Mon Tue Wed Thu Fri"
do
echo "Weekday $((i++)) : $day"
done
$ ./for1-wrong2.sh
Weekday 1 : Mon Tue Wed Thu Fri
2. Variable for the list after “in” keyword
Instead of providing the values directly in the for loop, you can store the values in a variable, and use the variable in the for loop after the “in” keyword, as shown in the following example.
$ cat for2.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
echo "Weekday $((i++)) : $day"
done
$ ./for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri
Caution: As a best practice, you should always quote the bash variables when you are referring it. There are few exceptions to this best practice rule. This is one of them. If you double quote the variable in this for loop, the list of values will be treated as single value. Lot of people fall into this trap. Be careful and do not double quote your variable in the for loop.
$ cat for2-wrong.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
for day in "$weekdays"
do
echo "Weekday $((i++)) : $day"
done
$ ./for2-wrong.sh
Weekday 1 : Mon Tue Wed Thu Fri
3. Don’t specify the list; get it from the positional parameters
If you don’t specify the keyword “in” followed by any list of values in the bash for loop, it will use the positional parameters (i.e the arguments that are passed to the shell script).
$ cat for3.sh
i=1
for day
do
echo "Weekday $((i++)) : $day"
done
$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri
Caution: Please be careful if you use this method. You should not include the keyword “in” in the for loop. If you leave the keyword “in” without any values, it will not use the positional parameter as shown below. It will not go inside the loop. i.e for loop will never get executed as shown in the example below.
$ cat for3-wrong.sh
i=1
for day in
do
echo "Weekday $((i++)) : $day"
done
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
$ ./for3-wrong.sh Mon Tue Wed Thu Fri
Note: Refer to our earlier article to understand more about bash positional parameters.
4. Unix command output as list values after “in” keyword
You can use the output of any UNIX / Linux command as list of values to the for loop by enclosing the command in back-ticks ` ` as shown below.
$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
echo "Username $((i++)) : $username"
done
$ ./for4.sh
Username 1 : ramesh
Username 2 : john
Username 3 : preeti
Username 4 : jason
..
5. Loop through files and directories in a for loop
To loop through files and directories under a specific directory, just cd to that directory, and give * in the for loop as shown below.
The following example will loop through all the files and directories under your home directory.
$ cat for5.sh
i=1
cd ~
for item in *
do
echo "Item $((i++)) : $item"
done
$ ./for5.sh
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
Item 1 : positional-parameters.sh
Item 2 : backup.sh
Item 3 : emp-report.awk
Item 4 : item-list.sed
Item 5 : employee.db
Item 8 : storage
Item 9 : downloads
Usage of * in the bash for loop is similar to the file globbing that we use in the linux command line when we use ls command (and other commands).
For example, the following will display all the files and directories under your home directory. This is the concept that is used in the above for5.sh example.
cd ~
ls *
The following will display all the *.conf file that begins with either a, b, or, c or d under /etc directory.
$ ls -1 /etc/[abcd]*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf
The same argument that is used in the ls command above, can be used in a bash for loop, as shown in the example below.
$ cat for5-1.sh
i=1
for file in /etc/[abcd]*.conf
do
echo "File $((i++)) : $file"
done
$ ./for5-1.sh
File 1 : /etc/asound.conf
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
File 2 : /etc/autofs_ldap_auth.conf
File 3 : /etc/cas.conf
File 4 : /etc/cgconfig.conf
File 5 : /etc/cgrules.conf
File 6 : /etc/dracut.conf
6. Break out of the for loop
You can break out of a for loop using ‘break’ command as shown below.
$ cat for6.sh
i=1
for day in Mon Tue Wed Thu Fri
do
echo "Weekday $((i++)) : $day"
if [ $i -eq 3 ]; then
break;
fi
done
$ ./for6.sh
Weekday 1 : Mon
Weekday 2 : Tue
7. Continue from the top of the for loop
Under certain conditions, you can ignore the rest of the commands in the for loop, and continue the loop from the top again (for the next value in the list), using the continue command as shown below.
The following example adds “(WEEKEND)” to Sat and Sun, and “(weekday)” to rest of the days.
$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
echo -n "Day $((i++)) : $day"
if [ $i -eq 7 -o $i -eq 8 ]; then
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
echo " (WEEKEND)"
continue;
fi
echo " (weekday)"
done
$ ./for7.sh
Day 1 : Mon (weekday)
Day 2 : Tue (weekday)
Day 3 : Wed (weekday)
Day 4 : Thu (weekday)
Day 5 : Fri (weekday)
Day 6 : Sat (WEEKEND)
Day 7 : Sun (WEEKEND)
8. Bash for loop using C program syntax
This example uses the 2nd method of bash for loop, which is similar to the C for loop syntax. The following example generates 5 random number using the bash C-style for loop.
$ cat for8.sh
for (( i=1; i <= 5; i++ ))
do
echo "Random number $i: $RANDOM"
done
$ ./for8.sh
Random number 1: 23320
Random number 2: 5070
Random number 3: 15202
Random number 4: 23861
Random number 5: 23435
9. Infinite Bash for loop
When you don’t provide the start, condition, and increment in the bash C-style for loop, it will become infinite loop. You need to press Ctrl-C to stop the loop.
海姹网(网址:http://www.seacha.com),标签:Linux Shell for循环写法总结, awk,expr
$ cat for9.sh
i=1;
for (( ; ; ))
do
sleep $i
echo "Number: $((i++))"
done
Like we said above, press Ctrl-C to break out of this bash infinite for loop example.
$ ./for9.sh
Number: 1
Number: 2
Number: 3
10. Using comma in the bash C-style for loop
In the bash c-style loop, apart from increment the value that is used in the condition, you can also increment some other value as shown below.
In the initialize section, and the increment section of the bash C-style for loop, you can have multiple value by separating with comma as shown below.
The following for loop is executed a total of 5 times, using the variable i. However the variable j start with 5, and getting increment by 5 every time the loop gets executed.
$ cat for10.sh
for ((i=1, j=10; i <= 5 ; i++, j=j+5))
do
echo "Number $i: $j"
done
$ ./for10.sh
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30
11. Range of numbers after “in” keyword
You can loop through using range of numbers in the for loop “in” using brace expansion.
The following example loops through 10 times using the values 1 through 10.
$ cat for11.sh
for num in {1..10}
do
echo "Number: $num"
done
$ ./for11.sh
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
...
12. Range of numbers with increments after “in” keyword
The following example loops through 5 times using the values 1 through 10, with an increment of 2. i.e It starts with 1, and keeps incrementing by 2, until it reaches 10.
$ cat for12.sh
for num in {1..10..2}
do
echo "Number: $num"
done
$ ./for12.sh
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9
来源未知。
- Linux Shell Scripting Cookbook 读书笔记 1
本系列文章为<Linux Shell Scripting Cookbook>的读书笔记,只记录了我觉得工作中有用,而我还不是很熟练的命令 书是很好的书,有许多命令由于我比较熟悉,可能就没有 ...
- Bash For Loop Examples
How do I use bash for loop to repeat certain task under Linux / UNIX operating system? How do I set ...
- Linux Shell Scripting Cookbook 读书笔记 7
ping, du, ps, kill, 收集系统信息 判断网络中哪些主机是活动主机 #!/bin/bash for ip in 10.215.70.{1..255}; do ( ping $ip -c ...
- Linux Shell Scripting Cookbook 读书笔记 2
cat,script,find, xargs, tr, tmp文件,字符串截取,批量文件重命名,固定大小文件,自动化交互 1. cat的用法 压缩连续的空白行 cat -s file 也可以用tr,将 ...
- Linux Shell Scripting Tutorial (LSST) v2.0
http://bash.cyberciti.biz/wiki/index.php?title=Main_Page
- Linux Shell Scripting Cookbook 读书笔记 6
wget,curl, tar, rsync wget ftp://example.com/somefile.img -t 5 -O download.img -o log -t表示重试的次数 -O指定 ...
- Linux Shell Scripting Cookbook 读书笔记 5
sed,awk 1. sed (string editor) 使用-i可以将结果运用于原文件 sed 's/text1/text2/' file > newfile mv newfile fil ...
- Linux Shell Scripting Cookbook 读书笔记 4
正则, grep 1. 正则表达式 正则表达式 描述 示例 ^ 行起始标记 ^hell匹配以hell开头的行 $ 行尾标记 test$匹配以test结尾的行 . 匹配任意一个字符 hell ...
- Linux Shell Scripting Cookbook 读书笔记 3
patch, tree, head ,tail 1. 创建不可修改文件 chattr +i file chattr -i file 移除不可修改属性 2. 能够启动闪存或硬盘的混合ISO isohyb ...
随机推荐
- Oracle Form 特殊的默认值 $$variables$$
Oracle Forms 提供了六个特殊的系统变量,均为提供日期和时间的信息的变量: •$$DATE$$ •$$TIME$$ •$$DATETIME$$ •$$DBDATE$$ •$$DBTIME$$ ...
- C#中的几个线程同步对象方法
在编写多线程程序时无可避免会遇到线程的同步问题.什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的 ...
- arch Linux not found device 错误解决
使用Archlinux LiveCD mount /dev.sda1 /mnt (有boot分区的挂boot) Running mkinitcpio -p linux Running grub-mkc ...
- Arch linux安装
安装archlinux可参考: http://blog.sina.com.cn/s/blog_69e5d8400101bqlj.html http://www.cnblogs.com/mad/p/32 ...
- 使用 EPUB 制作数字图书
基于 XML 的开放式 eBook 格式 是否需要分发文档.创建电子图书或者把喜欢的博客文章存档?EPUB 是一种开放式的数字图书规范,以常用的技术如 XML.CSS 和 XHTML 为基础,EPUB ...
- SSL双向认证(高清版)
介绍了SSL双向认证的一些基本问题,以及使用Nginx+PHP基于它搭建https的Webservice. 之前的方式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这里我再整理记录下. 由于n ...
- 【转】git使用教程
Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...
- CefSharp中实现Chrome中jS导出Excel
[前言] 在博客园闲逛了一年多,平时都是借鉴别人的成功经验,总觉得自己应该分享点什么,但是苦于自己技术有限,平时又不爱写东西,所以一直没有写过任何东西.毕业一年多,在现实工作中遇到各种问题,深切体会到 ...
- UVALive-4287 Proving Equivalences 有向图的强连通分量+缩点
题意:有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导. 思路:由已知的推导可以建一张无向图,则问题变成了最少需要增加几条边能使图变成强连通图.找出所有 ...
- 六种简单方法提升ASP.NET Web API性能
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...