第25課LinuxShellプログラミング3のより多くの構造化コマンド

9017 ワード

説明:この文書の一部は書籍「Linuxコマンドラインとshellスクリプトプログラミング大全」から抜粋され、著作権は原作者の所有となっている.***
第十三章:より多くの構造化コマンド
本章の内容
for    
until      while  
  
        


13.1 forコマンド
コマンドフォーマット
for var in list
do
    commands
done


コマンドの説明:変数varはlistの反復値であり、do文とdone文の間に入力されるコマンドは1つ以上の標準bash shellコマンドであってもよい.
13.1.1リストの値を読み取る
forコマンドの最も基本的な使い方は、forコマンド自体が定義した一連の値を巡回することです.
test 1を記述する.shスクリプト
#!/bin/bash
for test in One The Three Four Five Six
do
    echo "The next number is $test"
done


test 1 bを作成する.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               
          ,      
        (   )    
         ,      


test 2を記述する.shスクリプト
#!/bin/bash
for test in I don\'t know "this'll" work
do
    echo "word:$test"
done


test 3を作成する.shスクリプト
#!/bin/bash
for test in Nevada "New Hampshire" "New Mexico" "New York"
do
    echo "Now going to $test"
done


13.1.3変数からリストを読み込む
test 4を記述する.shスクリプト
#!/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


test 5を記述する.shスクリプト
#!/bin/bash
file="number"
for number in $(cat $file)
do
    echo "The number is $number"
done


13.1.5フィールド区切りの変更
bash shellでは、スペース/タブ/改行をフィールド分割子として使用します.
            IFS=$'
' bash shell

test 5 bを記述する.shスクリプト
#!/bin/bash
file="number"
IFS=$'
' for number in $(cat $file) do echo "The number is $number" done

13.1.6ワイルドカードでディレクトリを読み込む
forコマンドを使用してディレクトリ内のファイルを自動的に巡回できます
test 6を記述する.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


test 7を記述する.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
",i); }

bashにおけるC言語スタイルのforループフォーマット
for (( variable assignment ; condition ; iteration process ))
         
              
         expr    


test 8を記述する.shスクリプト
#!/bin/bash
for (( i=1; i<=10;i++ ))
do
    echo "The next number is $i"
done


13.2.2複数の変数の使用
test 9を記述する.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            


test 10を記述する.shスクリプト
#!/bin/bash
var1=10
while [ $var1 -gt 0 ]
do
    echo $var1
    var1=$[ $var1 - 1 ]
done


13.3.2複数のテストコマンドを使用する
while      while          
                              
  ,                


test 11を記述する.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,      


test 12を記述する.shスクリプト
#!/bin/bash
var1=100
until [ $var1 -eq 0 ]
do
    echo $var1
    var1=$[ $var1-25 ]
done


test 13を記述する.shスクリプト
#!/bin/bash
var1=100
until echo $var1
      [ $var1 -eq 0 ]
do
    echo Inside the loop: $var1
    var1=$[ $var1-25 ]
done


13.5ネストループ
ループ文は、他のループコマンドを含む任意のタイプのコマンドをループ内で使用できます.
test 14を記述する.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


test 15を記述する.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


test 16を記述する.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.単一ループからのジャンプ
作成test 17.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"


test 18を記述する.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.内部ループから飛び出す
test 19を記述する.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.外部ループから飛び出す
test 20を作成する.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コマンド
作成test 21.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


test 22を記述する.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コマンドの後に処理コマンドを追加することで、ループの出力をパイプまたはリダイレクトすることができます.
作成test 23.shスクリプト
#!/bin/bash
for (( a=1;a<10;a++ ))
do
    echo "The number is $a"
done > test23.txt
echo "The command is finished"


test 24を作成する.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実行可能ファイルの検索
作成test 25.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複数のユーザーアカウントの作成
test 26を作成する.shスクリプト
#!/bin/bash
input="users.csv"
while IFS=',' read -r userid name
do
    echo "adding $userid"
    useradd -c "$name" -m $userid
done < "$input"


作成するcsvファイル
rich,Richard Blum
tim,Timothy Bresnahan


13.10まとめ
bash shellは、スクリプトで使用できる3つのループコマンドを提供します.
for            
while             
until