shell ——for in 循環

 shell 編程——for in 循環shell

 
-------for in 格式-------
 
 
  
  
           
  
  
  1. for 無$變量 in 字符串 
  2. do 
  3.   $變量 
  4. done 
 
一簡單的字符串 枚舉遍歷法,利用for in格式對字符串按空格切份的功能
 
  
  
           
  
  
  1. SERVICES="80   22   25   110   8000   23   20   21   3306   " 
  2.  
  3. for   x   in   $SERVICES     
  4.   do      
  5.   iptables   -A   INPUT   -p   tcp   --dport   $x   -m   state   --state   NEW   -j   ACCEPT      
  6.   done 
 
-------for variable in values--------------字符串數組依次賦值
  
  
           
  
  
  1. #!/bin/sh 
  2. for i in a b c           字符串列表A B C  
  3.          字符串用空格分隔,沒有括號,沒有逗號, 而後循環將其依次賦給變量i 
  4.          變量沒有$ 
  5. do 
  6. echo "i is $i" 
  7. done  
[macg@machome ~]$ sh test.sh
i is a
i is b
i is c
 
 
-------for in 裏,變量和*不等價-------
  
  
           
  
  
  1. #!/bin/bash 
  2. for i in *.h ; 
  3. do 
  4. cat ${i}.h 
  5. done  
[macg@vm test]$ ./tip.sh
cat: *.h.h: No such file or directory 
$i表明的是整個路徑,而不是*.h裏的.h前面的部分
改正
 
  
  
           
  
  
  1. #!/bin/bash 
  2. for i in *.h 
  3. do 
  4. cat $i 
  5. done   
[macg@vm test]$ echo hahaha >>1.h
[macg@vm test]$ echo ha >>2.h
 
[macg@vm test]$ ./tip.sh
hahaha
ha    
例2:
  
  
           
  
  
  1. for i in /etc/profile.d/*.sh  
  2. do 
  3.   $i 
  4. done  
 $i表明的是/etc/profile.d/color.sh,
/etc/profile.d/alias.sh, /etc/profile.d/default.sh
          
-------for in 對(命令行,函數)參數遍歷-------
  
  
           
  
  
  1. test() 
  2.         local i 
  3.         for i in $* ; do 
  4.              echo "i is $i" 
  5.         done 
$*是字符串:以"參數1 參數2 ... " 形式保存全部參數 
$i是變量i的應用表示
[macg@machome ~]$ sh test.sh p1 p2 p3 p4
 
i is p1
i is p2
i is p3
i is p4 
 
 
------- for in語句與通配符*合用,批量處理文件-------
    批量改文件名
[root@vm testtip]# ls
aaa.txt  ccc.txt  eee.txt  ggg.txt  hhh.txt  jjj.txt  lll.txt  nnn.txt
bbb.txt  ddd.txt  fff.txt  go.sh    iii.txt  kkk.txt  mmm.txt  ooo.txt
[root@vm testtip]# cat go.sh
 
  
  
           
  
  
  1. for i in *.txt                 *.txt至關於一個字符串數組,依次循環賦值給i 
  2. do 
  3. mv "$i" "$i.bak"        
  4. done 
[root@vm testtip]# sh go.sh
 
[root@vm testtip]# ls
aaa.txt.bak  ccc.txt.bak  eee.txt.bak  ggg.txt.bak  hhh.txt.bak  jjj.txt.bak  lll.txt.bak  nnn.txt.bak bbb.txt.bak  ddd.txt.bak  fff.txt.bak  go.sh        iii.txt.bak  kkk.txt.bak  mmm.txt.bak  ooo.txt.bak
 
-------for in語句與` `和$( )合用,利用` `或$( )的將多行合爲一行的缺陷,實際是合爲一個字符串數組-------
 
  
  
           
  
  
  1. for i in $(ls *.txt)         
  2. do 
  3. echo $i 
  4. done 
[macg@machome ~]$ sh test
111-tmp.txt
111.txt
22.txt
33.txt
或者說,利用for in克服` `和$( ) 的多行合爲一行的缺陷
 
 
-------利用for in 自動對字符串按空格遍歷的特性,對多個目錄遍歷-------
 
  
  
           
  
  
  1. LIST="rootfs usr data data2" 
  2.     
  3. for d in $LIST; do          
  4.   mount /backup/$d 
  5.   rsync -ax --exclude fstab --delete /$d/ /backup/$d/ 
  6.   umount /backup/$d 
  7. done 
********Linux Shell for循環寫法總結********
 
  
  
           
  
  
  1. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done 
  2. 在shell中經常使用的是 for i in $(seq 10) 
  3. for i in `ls` 
  4. for i in ${arr[@]}  
  5. for i in $* ; do 
  6. for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do 
  7. for i in f1 f2 f3 ;do 
  8. for i in *.txt 
  9. for i in $(ls *.txt) 
for in語句與` `和$( )合用,利用` `或$( )的將多行合爲一行的缺陷,實際是合爲一個字符串數組
 
============ -_- ==============for num in $(seq 1 100)
 
  
  
           
  
  
  1. LIST="rootfs usr data data2" 
  2. for d in $LIST; do 
  3. 用for in語句自動對字符串按空格遍歷的特性,對多個目錄遍歷 
  4. for i in {1..10} 
  5. for i in stringchar {1..10} 
  6. awk 'BEGIN{for(i=1; i<=10; i++) print i}' 
注意:AWK中的for循環寫法和C語言同樣的
===============================================================
 
  
  
           
  
  
  1. #/bin/bash 
  2. # author: 周海漢 
  3. # date :2010.3.25 
  4. # blog.csdn.net/ablo_zhou 
  5.  
  6. arr=("a" "b" "c") 
  7. echo "arr is (${arr[@]})" 
  8. echo "item in array:" 
  9. for i in ${arr[@]} 
  10. do 
  11.  echo "$i" 
  12. done 
  13. echo "參數,\$*表示腳本輸入的全部參數:" 
  14. for i in $* ; do 
  15. echo $i 
  16. done 
  17. echo 
  18. echo '處理文件 /proc/sys/net/ipv4/conf/*/accept_redirects:' 
  19. for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do 
  20. echo $File 
  21. done 
  22. echo "直接指定循環內容" 
  23. for i in f1 f2 f3 ;do 
  24. echo $i 
  25. done 
  26. echo 
  27. echo "C 語法for 循環:" 
  28. for (( i=0; i<10; i++)); do 
  29. echo $i 
  30. done 
---------------------------------------------------------------------------------------------------------
 
shell中for循環用法
shell語法好麻煩的,一個循環都弄了一會 ,找了幾個不一樣的方法來實現輸出1-100間能夠被3整除的數
1.用(())
 
  
  
           
  
  
  1. #!/bin/bash 
  2. clear 
  3. for((i=1;i<100;i++)) 
  4. for 
  5. do 
  6. if((i%3==0)) 
  7. then 
  8. echo $i 
  9. continue 
  10. fi 
  11. done 
2.使用`seq 100`
 
  
  
           
  
  
  1. #!/bin/bash 
  2. clear 
  3.  
  4. for i in `seq 100` 
  5. do 
  6. if((i%3==0)) 
  7. then 
  8. echo $i 
  9. continue 
  10. fi 
  11. done 
3.使用while
 
  
  
           
  
  
  1. #!/bin/bash 
  2. clear 
  3.  
  4. i=1 
  5. while(($i<100)) 
  6. do 
  7. if(($i%3==0)) 
  8. then 
  9. echo $i 
  10. fi 
  11. i=$(($i+1)) 
  12. done 
 
 
 
--------------------------------------------------------------------------------------------------------
在shell用for循環作數字遞增的時候發現問題,特列出shell下for循環的幾種方法:
 
1.
 
 
  
  
           
  
  
  1. for i in `seq 1 1000000`;do 
  2.  
  3. echo $i 
  4.  
  5. done 
用seq 1 10000000作遞增,以前用這種方法的時候沒遇到問題,由於以前的i根本就沒用到百萬(1000000),由於項目須要我這個數字遠大於百萬,發現用seq 數值到 1000000時轉換爲1e+06,根本沒法做爲數字進行其餘運算,或者將$i有效、正確的取用,遂求其餘方法解決,以下
 
2.
 
 
  
  
           
  
  
  1. for((i=1;i<10000000;i++));do 
  2.  
  3. echo $i 
  4.  
  5. done 
3.
 
  
  
           
  
  
  1. i=1 
  2.  
  3. while(($i<10000000));do 
  4.  
  5. echo $i 
  6.  
  7. i=`expr $i + 1` 
  8.  
  9. done 
由於本方法調用expr故運行速度會比第1,第2種慢很多不過可稍做改進,將i=`expr $i + 1`改成i=$(($i+1))便可稍做速度的提高,不過具體得看相應shell環境是否支持
 
4.
 
  
  
           
  
  
  1. for i in {1..10000000;do 
  2.  
  3. echo $i 
  4.  
  5. done 
其實選用哪一種方法具體仍是得由相應的shell環境的支持,達到預期的效果,再考慮速度方面的問題。
 
 
[root@mail mnt]# ll
-rw-r--r--  1 root root       0 Mar 28 14:24 test.20130326
-rw-r--r--  1 root root       0 Mar 28 14:24 test.20130327
-rw-r--r--  1 root root       0 Mar 28 14:24 test.20130328
-rw-r--r--  1 root root       0 Mar 28 14:24 test.20130329
 
 
  
  
           
  
  
  1. #!/bin/bash 
  2. D=`date +%Y%m%d` 
  3. for A in `ls | grep $D` 
  4. do 
  5. echo "$A" 
[root@mail mnt]# ./aa.sh 
test.20130328
done
相關文章
相關標籤/搜索