天天看點

LInux shell之(for in 用法總結)

一、文法

for 變量名  in  清單
  do
     程式段(command)
  done
           

注意1:是變量名而不是$變量!

注意2:清單可以做文章!

二、應用

第一類:數字性循環-->seq在in後面的應用

#!/bin/bash  
#也是産生等差數列-->預設是1
for i in $(seq 1 10)  #産生的是一個字元串,預設IFS是以空格隔開!
  do   
    echo $(expr $i \* 3 + 1);  #主要是複習:expr乘法的特殊用法!-->空格隔開
  done   
           

補充:産生[1,10]的自然數-->{}在in後面的應用

total=0 #全局變量
for i in {1..100} #".."表示連續,預設也是IFS為空格隔開
  do
    ((total+=i))
  done
echo -e "total is:${total}"

#多行注釋
<<COMMENR
for i in mysql_{0,1,4,12}sql #多個檔案
  do 
    echo $i
    samtools view -c $i 
  done
COMMENT
           

第二類:字元性循環

最原始的

#!/bin/bash
#使用清單for循環顯示周一到周日對應的英文-->學習日期的英文
for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday 
  do
      echo "$day"
  done
           

變量的類型

#!/bin/bash  
list="Linux Java C++ Python"  
for i in $list  
  do  
    echo -e "Language is ${i}"   
  done  
           

cat在in後面的應用-->逐行讀取檔案的内容(預設是IFS),是以不是逐行列印!

#!/bin/bash
for i in $(cat 日志顔色.sh) #注意:pwd目前目錄下的檔案
 do 
   echo $i
 done
           

思考:如果想逐行原樣輸出!

#!/bin/bash
# reading content from a file
file="日志檔案.sh"
#将這個語句加入到腳本中,告訴bash shell在資料值中忽略空格和制表,使其隻能識别換行符!
IFS=$'\n'
for std in $(cat $file)
  do
     echo "$std"
  done
           

說明:IFS的一些說明!

bash shell會将下列字元當作字段分隔符:空格、制表符、換行符

說明:如果在shell在資料中看到這些字元中的任意一個,它就會假定這表明了清單中一個新資料字段的開始!
           

參考的最佳安全實踐:在改變IFS之前儲存原來的IFS值,之後再恢複它。

保證了:在腳本的後續操作中使用的是IFS的預設值

實作:

IFS.OLD=$IFS          #預設的IFS的數值-->也是環境變量!
IFS=$'\n'             #自定義的IFS數值
<在代碼中使用新的IFS值> #待使用自定義IFS的部分!
IFS=$IFS.OLD          #恢複預設的IFS
           

第三類:路徑查找

ls在in後面的指令是-->讀取目前pwd下的檔案(廣義上)!

#!/bin/bash  
for i in `ls`;  #ls可以結合統配符應用!
  do   
    echo $i is file name\! ;  #注意:\的應用!
  done   
           

 用通配符讀取目錄(無指令)

for file in ~/*;  #一級目錄下的内容-->并不遞歸顯示! 
  do  
     echo $file is file path \! ;  #${file}代表的是檔案的全路徑
  done 
           

通過腳本傳參

#!/bin/bash
#回憶1:統計腳本參數的個數
echo "argument number are $#"!
#回憶2:參數的内容-->此處可以換成[email protected]來測試!
echo "the input is $*"
#循環執行
for argument in "$*";
  do
      echo "$argument "
  done
           

IFS:内部字段分隔符

需求如下:

#周遊一個檔案中用冒号分隔的值:-->特殊檔案-->/etc/passwd檔案等!
IFS=:
#如果要指定多個IFS字元,隻要将它們在指派行串起來就行。
IFS=$'\n':;"
           

總結:

#(1)從變量讀取清單
# 将一系列的值都集中存儲在一個變量中,然後需要周遊變量中的整個清單

#(2)從指令讀取值
#有兩種方式可以将指令輸出指派給變量:
# (1)反引号字元(`)
# (2)$()格式 
           

補充:在清單構成上分多種情景,如數字清單、字元串清單、指令清單、腳本傳參清單等!

繼續閱讀