shell下for循环的详细使用

26 篇文章 0 订阅

今天看到个脚本

for arg

do

.....

done

没见过这种写法,也不大明白,然后就百度了一下,发现果真有这种写法。

然后自己写代码试了下

#!/bin/sh

#fileName:for.sh

###################

for arg

do

echo $arg

done


$./for.sh                  无输出

$./for.sh 1 2 3 4 5 输入如下

1

2

3

4

5

$

###################以下是整理得来的for的用法##########

常用格式:

格式一

for 变量

do

    语句

done

格式二

for 变量 in 列表

do

    语句

done

格式三

for ((变量=初始值; 条件判断; 变量变化))

do

    语句

done

使用示例

示例一

Bash代码  
  1. for in ac apropos at arp  
  2. do  
  3.      echo $s  
  4. done  

[root@jfht ~]# for s in ac apropos at arp
> do
    echo $s
> done
ac
apropos
at
arp
[root@jfht ~]#

示例二

Bash代码  
  1. for in  
  2. do  
  3.     echo $f  
  4. done  
[root@jfht ~]# for f in *

> do
    echo $f
> done
anaconda-ks.cfg
bak181
hlx
install.log
install.log.syslog
job.sh
job.txt
mbox
mini
setup
temp
vsftpd-2.0.5-16.el5.i386.rpm
vsftpd.conf
work191
[root@jfht ~]#

 示例三

Bash代码  
  1. ls >ls.txt  
  2. for in $(cat ls.txt)  
  3. do  
  4.     echo $s  
  5. done  
  [root@jfht ~]# ls >ls.txt

[root@jfht ~]# for s in $(cat ls.txt)
>
> do
>
    echo $s
>
> done
anaconda-ks.cfg
bak181
hlx
install.log
install.log.syslog
job.sh
job.txt
ls.txt
mbox
mini
setup
temp
vsftpd-2.0.5-16.el5.i386.rpm
vsftpd.conf
work191
[root@jfht ~]#

 示例四

Bash代码  
  1. print_args()  
  2.  
  3.     for arg in "$@"  
  4.     do  
  5.         echo $arg  
  6.     done  
  7.  
  8. print_args  
  9. print_args "this is test"  
  10. "color: #000000;">print_args this is test  

[root@smsgw root]# print_args()
> {
    for arg in "$@"
    do
        echo $arg
    done
> }
[root@smsgw root]# print_args 1 2 3 4
1
2
3
4
[root@smsgw root]# print_args "this is a test"
this is a test
[root@smsgw root]# print_args this is a test
this
is
a
test

示例五

Bash代码  
  1. for ((i=0; i<</span>10; ++i))  
  2. do  
  3.     echo $i  
  4. done  

 [root@smsgw root]# for ((i=0; i<10; ++i))
> do
    echo $i
> done
0
1
2
3
4
5
6
7
8
9

 示例六 列表为数组

Bash代码  
  1. AREAS=(1901 1902 1903 1904 1905 1906 1907   1908 1909 1910 1911 1912 1913)  
  2. NAMES=(南京 无锡 徐州 常州 苏州 南通 连云港 淮安 盐城 扬州 镇江 泰州 宿迁)  
  3. NUM_OF_AREAS=13  
  4. area_name_of()  
  5.  
  6.     for ((I=0; I<$NUM_OF_AREAS; ++I))  
  7.     do  
  8.         if "$1" == "${AREAS[I]}" ]; then  
  9.             echo "${NAMES[I]}"  
  10.         fi  
  11.     done  
  12.  
  13. echo $(area_name_of 1903)  
  14. for AREA in ${AREAS[*]};  
  15. do  
  16.     echo $AREA $(area_name_of $AREA)  
  17. done  

 [root@smsgw root]# AREAS=(1901 1902 1903 1904 1905 1906 1907   1908 1909 1910 1911 1912 1913)
[root@smsgw root]# NAMES=(南京 无锡 徐州 常州苏州 南通 连云港 淮安 盐城 扬州 镇江 泰州 宿迁)
[root@smsgw root]# NUM_OF_AREAS=13
[root@smsgw root]# area_name_of()
> {
    for ((I=0; I<$NUM_OF_AREAS; ++I))
    do
        if [ "$1" == "${AREAS[I]}" ]; then
            echo "${NAMES[I]}"
        fi
    done
> }
[root@smsgw root]# echo $(area_name_of 1903)
徐州
[root@smsgw root]# for AREA in ${AREAS[*]};
> do
    echo $AREA $(area_name_of $AREA)
> done
1901 南京
1902 无锡
1903 徐州
1904 常州
1905 苏州
1906 南通
1907 连云港
1908 淮安
1909 盐城
1910 扬州
1911 镇江
1912 泰州
1913 宿迁
[root@smsgw root]#

 示例七 bash version 3.0+

Java代码  
  1. bash --version  
  2. for in {1..5}  
  3. do  
  4.    echo "Welcome $i times"  
  5. done   

 

[root@smsgw root]# bash --version
GNU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2002 Free Software Foundation, Inc.
[root@smsgw root]# for i in {1..5}
> do
   echo "Welcome $i times"
> done
Welcome {1..5} times
[root@smsgw root]#

换个较高版本的Linux。

[root@jfht ~]# bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
[root@jfht ~]# for i in {1..5}
> do
   echo "Welcome $i times"
> done
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
[root@jfht ~]#

 示例八 Bash v4.0+

Bash代码  
  1. echo "Bash version ${BASH_VERSION}..."  
  2. for in {0..10..2}  
  3.   do  
  4.      echo "Welcome $i times"  
  5.  done  

 [root@smsgw root]# echo "Bash version ${BASH_VERSION}..."
Bash version 2.05b.0(1)-release...
[root@smsgw root]# for i in {0..10..2}
  do
     echo "Welcome $i times"
done
Welcome {0..10..2} times
[root@smsgw root]#

换个较高版本的Linux。

[root@jfht ~]# echo "Bash version ${BASH_VERSION}..."
Bash version 3.2.25(1)-release...
[root@jfht ~]# for i in {0..10..2}
  do
     echo "Welcome $i times"
done
Welcome {0..10..2} times
[root@jfht ~]#

传说Bash4.0可以支持这种语法。

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

问题思考

1. 怎么用for实现死循环(无限循环)?

2. 比较几种写法的不同:(1) for arg in $* (2) for arg in $@ (3) for arg in "$*" (4) for arg in "$@"

3. 怎么跳出for循环?

4. for s; do echo $s; done  这个写法的执行结果是什么?

相关资料

【1】小蜗牛技术之家 BASH for 循环小结

【2】相当不错的介绍for语句的英文资料 Bash For Loop Examples

【3】Bash新手指南 第9章 重复性任务

【4】Keep IT Simple and Stupid 在Bash的命令行使用For循

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值