Linux_《Linux命令行與shell腳本編程大全》第十三章學習總結

時間:2017年09月13日星期三
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第十三章學習總結shell

第十三章:更多的結構化命令

本章內容編程

for循環語句
until迭代語句使用while語句
循環
重定向循環的輸出

13.1 for命令

命令格式bash

for var in list
do
    commands
done

命令說明:變量var爲list中的迭代值,在do和done語句之間輸入的命令能夠是一條或多條標準的bash shell命令。ide

13.1.1 讀取列表中的值

for命令最基本的用法就是遍歷for命令自身所定義的一系列值oop

編寫test1.sh腳本學習

#!/bin/bash
for test in One The Three Four Five Six
do
    echo "The next number is $test"
done

編寫test1b.sh腳本測試

#!/bin/bash

for test in One The Three Four Five Six
do
    echo "The next number is $test"
done

echo "The last number is $test"
test=Seven
echo "Now, Test number is $test"

13.1.2 讀取列表中的複雜值

for循環假定每一個值都是用空格分割的
當某個值有特殊字符時,須要進行轉義
可使用轉義字符(反斜線)和雙引號
當某個值包含空格時,需使用雙引號

編寫test2.sh腳本this

#!/bin/bash
for test in I don\'t know "this'll" work
do
    echo "word:$test"
done

編寫test3.sh腳本命令行

#!/bin/bash
for test in Nevada "New Hampshire" "New Mexico" "New York"
do
    echo "Now going to $test"
done

13.1.3 從變量讀取列表

編寫test4.sh腳本code

#!/bin/bash
list="One Two Three"
list=$list" Four"
for number in $list
do
    echo "The number is $number"
done

13.1.4 從命令讀取值

生成列表中所需值的另一個途徑就是使用命令的輸出
能夠用命令來替換執行任何能產生輸出的命令
而後在for命令中使用該命令的輸出

編寫number文本

One
Two
Three

編寫test5.sh腳本

#!/bin/bash
file="number"
for number in $(cat $file)
do
    echo "The number is $number"
done

13.1.5 更改字段分隔符

bash shell會將空格/製表符/換行符當作字段分割符

使用換行符做爲字段分隔符IFS=$'\n'
則bash shell會忽略空格和製表符
也能夠自定義使用特定字符做爲字段分隔符

編寫test5b.sh腳本

#!/bin/bash
file="number"
IFS=$'\n'
for number in $(cat $file)
do
    echo "The number is $number"
done

13.1.6 用通配符讀取目錄

可使用for命令來自動遍歷目錄中的文件

編寫test6.sh腳本

#!/bin/bash
for file in /home/zc/test/unit13/*
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f "$file" ]
    then
        echo "$file is a file"
    fi
done

編寫test7.sh腳本

#!/bin/bash
for file in /home/zc/test/unit13/*.sh /home/zc/test/unit12
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f "$file" ]
    then
        echo "$file is a file"
    fi
done

13.2 C語言風格的for命令

13.2.1 C語言的for命令

C語言for格式

for (i=0;i<10;i++)
{
    printlf("The next number is $d\n",i);
}

bash中C語言風格的for循環格式

for (( variable assignment ; condition ; iteration process ))
變量賦值能夠有空格
條件中的變量不能夠美圓符開頭
迭代過程的算式未用expr命令格式

編寫test8.sh腳本

#!/bin/bash
for (( i=1; i<=10;i++ ))
do
    echo "The next number is $i"
done

13.2.2 使用多個變量

編寫test9.sh腳本

#!/bin/bash
for(( a=1,b=10;a<=10;a++,b-- ))
do
    echo "$a - $b"
done

13.3 while命令

13.3.1 while的基本格式

命令格式

while test command
do
    other commands
done

命令說明

while命令中定義的test command和if-then語句中的格式如出一轍
while命令的關鍵在於所指定的test command的退出狀態碼必須隨着循環中運行的命令而改變
若是退出狀態碼不發生變化,while循環將一直不停的進行下去

編寫test10.sh腳本

#!/bin/bash
var1=10
while [ $var1 -gt 0 ]
do
    echo $var1
    var1=$[ $var1 - 1 ]
done

13.3.2 使用多個測試命令

while命令容許你在while語句定義多個測試條件
只有最後一個測試條件的退出狀態嗎會被用來決定何時結束循環
注意,每一個測試命令都出如今單獨的一行上

編寫test11.sh腳本

#!/bin/bash
var1=10
while echo $var1
      [ $var1 -ge 0 ]
do
    echo "The is inside the loop"
    var1=$[ $var1 - 1 ]
done

13.4 until命令

命令格式

until test commands
do
    other commands
done

命令說明

until命令和while命令工做的方式徹底相反
untile命令要求你指定一個一般返回非零退出狀態碼的測試命令
只有測試命令的退出狀態碼不爲0,bash shell纔會執行循環中列出的命令
一旦測試命令返回了退出狀態碼0,循環就結束了

編寫test12.sh腳本

#!/bin/bash
var1=100
until [ $var1 -eq 0 ]
do
    echo $var1
    var1=$[ $var1-25 ]
done

編寫test13.sh腳本

#!/bin/bash
var1=100
until echo $var1
      [ $var1 -eq 0 ]
do
    echo Inside the loop: $var1
    var1=$[ $var1-25 ]
done

13.5 嵌套循環

循環語句能夠在循環內使用任意類型的命令,包括其餘循環命令

編寫test14.sh腳本

#!/bin/bash

for (( a=1;a<=3;a++))
do
    echo "Starting loop $a:"
    for (( b=1;b<=3;b++))
    do
        echo "  Inside loop:$b"
    done
done

編寫test15.sh腳本

#!/bin/bash

var1=5

while [ $var1 -ge 0 ]
do
    echo  "Outer loog:$var1"
    for (( var2=1;$var2<3;var2++ ))
    do
        var3=$[ $var1 * $var2 ]
        echo "  Inner loop:$var1*$var2=$var3"
    done
    var1=$[ $var1 - 1 ]
done

編寫test16.sh腳本

#!/bin/bash

var1=3

until [ $var1 -eq 0 ]
do
    echo "Outer loop:$var1"
    var2=1
    while [ $var2 -lt 5 ]
    do
        var3=$(echo "scale=4;$var1 / $var2" | bc)
        echo "  Inner loop:$var1 / $var2 = $var3"
        var2=$[ $var2+1 ]
    done
    var1=$[ $var1 - 1 ]
done

13.6 循環處理文件數據

一般必須遍歷存儲在文件中的數據,這須要結合如下技術實現

使用嵌套循環:再次利用循環來讀取每一行中的數據
修改IFS環境變量:強制for命令將文件中的每行都當成單獨的一個條目來處理

13.7 控制循環

13.7.1 break命令

用break命令來退出任意類型的循環,包括while和until循環

1.跳出單個循環

編寫test17.sh腳本

#!/bin/bash
for var1 in 1 2 3 4 5 6 7 8 9 10
do
    if [ $var1 -eq 5 ]
    then
        break
    fi
    echo "Iteration number:$var1"
done
echo "The for loop is completed"

編寫test18.sh腳本

#!/bin/bash
var1=1
while [ $var1 -lt 10 ]
do
    if [ $var1 -eq 5  ]
    then
        break
    fi
    echo "Iteration:$var1"
    var1=$[ $var1+1 ]
done
echo "The while loop is completed"

2.跳出內部循環

編寫test19.sh腳本

#!/bin/bash
for (( a=1;a<4;a++ ))
do
    echo "Outer loop:$a"
    for (( b=1;b<100;b++ ))
    do
        if [ $b -eq 5 ]
        then
            break
        fi
        echo "  Inner loop:$b"
    done
done

3.跳出外部循環

編寫test20.sh腳本

#!/bin/bash

for (( a=1;a<4;a++ ))
do
    echo "Outer loop:$a"
    for(( b=1;b<100;b++ ))
    do
        if [ $b -gt 4 ]
        then
            break 2
        fi
        echo "  Inner loop:$b"
    done
done

13.7.2 continue命令

編寫test21.sh腳本

#!/bin/bash
for (( var1=1;var1<15;var1++ ))
do
    if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
    then
        continue
    fi
    echo "Iteration number:$var1"
done

編寫test22.sh腳本

#!/bin/bash
for (( a=1;a<=5;a++ ))
do
    echo "Iteration $a:"
    for (( b=1;b<3;b++ ))
    do
        if [ $a -gt 2 ] && [ $a -lt 4 ]
        then
            continue 2
        fi
        var3=$[ $a * $b ]
        echo "  The result of $a * $b = $var3"
    done
done

13.8 處理循環的輸出

經過在done命令以後添加一個處理命令來實現將循環的輸出使用管道或進行重定向

編寫test23.sh腳本

#!/bin/bash
for (( a=1;a<10;a++ ))
do
    echo "The number is $a"
done > test23.txt
echo "The command is finished"

編寫test24.sh腳本

#!/bin/bash
for state in "North Dakota" Connecticut Illinois Alabama Tennessee
do
    echo "$state is the next plae to go"
done | sort
echo "This completes our travels"

13.9 實例

13.9.1 查找可執行文件

編寫test25.sh腳本

#!/bin/bash

IFS=:
for folder in $PATH
do
    echo "$folder:"
    for file in $folder/*
    do
        if [ -x $file ]
        then
            echo "  $file"
        fi
    done
done

13.9.2 建立多個用戶帳戶

編寫test26.sh腳本

#!/bin/bash
input="users.csv"
while IFS=',' read -r userid name
do
    echo "adding $userid"
    useradd -c "$name" -m $userid
done < "$input"

編寫users.csv文件

rich,Richard Blum
tim,Timothy Bresnahan

13.10 小結

bash shell提供了三種可用於腳本中的循環命令

for命令容許你遍歷一系列的值
while命令提供基於命令條件的循環
until命令創建在命令或條件產生非零退出狀態碼的基礎上
相關文章
相關標籤/搜索