bashのフロー制御forループおよびbashコマンド終了ステータスコード


一、forループ定義:
コードを繰り返し実行します.----->条件に入る終了条件;
二、文法形式:
for変数名in LIST
do 
statement1
...
done
for VAR in LIST; do statement1; statement2; ...; done
三、LIST:リスト
定義:少なくとも1つの要素を含む文字列の集合.
LISTの生成方法:
(1)直接与える;
(2)数値リスト:
(a){start..end}、例えば:{1..10}
(b) seq [start [step]] end
(3)リストを返すコマンド;
(4) globbing;
(5)変数参照;
$*, $@
例えば、3人のユーザ、user 1、user 2、user 3を追加する.パスワードはユーザー名と同じです.
# vim user.sh
#!/bin/bash
#
for username in user1 user2 user3 ; do
       useradd $username
       echo $username |passwd --stdin $username
done
# bash -n user.sh 
# bash -x user.sh

たとえば、9人のユーザーを追加します.user 101...user109;パスワードはユーザー名と同じです.
#!/bin/bash
#
useradd user10$n
for n in {1..9}; do
    echo user10$n | passwd --stdin user10$n &>/dev/null   
done
        &>/dev/null  

四、forサイクル練習問題:
練習1:/tmp/testディレクトリに10個の空のファイルf 1を作成、..f10;
#!/bin/bash
#
for n in {1..10}; do
      mkdir /tmp/test/file$n &>/dev/null
done

練習2:スクリプトを書きます.
(1)「/tmp/test-現在時刻」ディレクトリを作成する.
(2)10ユーザtuser 1を追加、..tuser10; 
(3)「/tmp/test-現在時刻」ディレクトリに10空のファイルf 1,...,f10;
(4)f 1を修正する属主はtuser 1である.順番に類推する.
#!/bin/bash
#
directory=/tmp/test-`date +%H-%N-%S`
mkdir $directory
for i in {1..10};do 
useradd tuser$i
touch $directory/f$i
chown tuser$i $directory/f$i
done

練習3:100以内のすべての正の整数の和を求める;
#!/bin/bash
#
sum=0
#
for n in {1..100}; do
    sum=$[$n+$sum]
done
             :sum=0 declare -i sum=0
            let sum+=$i  sum &i 

練習4:100以内のすべての偶数の和を求めます;そしてすべての奇数の和;
#!/bin/bash
#
ODD_SUM=0
#
EVEN_SUM=0
#
ODD_LIST=$(seq 1 2 100)
EVEN_LIST=$(seq 0 2 100)
#
for n in $ODD_LIST; do
    ODD_SUM=$[$ODD_SUM+$n]
done
#
echo " :$ODD_SUM"
#
for m in $EVEN_LIST; do
    EVEN_SUM=$[$EVEN_SUM+$m]
done
#
echo " :$EVEN_SUM"

練習5:現在のシステム上のすべてのユーザーIDの和を計算する.
#!/bin/bash
#
UID_SUM=0
UID_LIST=$(cut -d':' -f3 /etc/passwd)
#
for n in $UID_LIST; do
    UID_SUM=$[$UID_SUM+$n]
done
echo "The all user ID sum is '$UID_SUM'"

練習6:パラメータ(テキストファイルパス)をスクリプトに渡し、すべてのファイルの空白行数の和を統計します.今回、どれだけのファイルを統計したかを示します.
#!/bin/bash
#
File_Sum=$#
echo "the sum of file is $File_Sum"
for i in $*; do
    Space_Sum=$(grep '^[[:space:]]*$' $i | wc -l)
    SPACE_ALL=$[$SPACE_ALL+$Space_Sum]
done
echo "the sum of space is $SPACE_ALL"
#  $* 

練習7:現在のシステムのすべてのデフォルトshellがbashのユーザーの総数を表示します.これらのユーザIDの和を統計する.
#!/bin/bash
#
BASH_SUM=0
BASH_SUM=$(grep 'bash$' /etc/passwd | wc -l)
echo "the sum of bash is $BASH_SUM"
UID_SUM=0
UID_LIST=$(grep 'bash$' /etc/passwd | cut -d':' -f3)
for n in $UID_LIST; do
    UID_SUM=$[$UID_SUM+$n]
done
echo "the sum of BID is $UID_SUM"
grep 'bash$' /etc/passwd | cut -d':' -f3

練習8:スクリプトを書く
(1)あるディレクトリの下にK##とS##の先頭ファイルがいくつかあると仮定する.(/etc/rc.d/rc 3.d/を例に挙げる.)
(2)このディレクトリの下のKで始まるすべてのファイルにstopパラメータを渡す.(echo "/etc/rc.d/rc3.d/atd stop")
(3)このディレクトリの下のSで始まるすべてのファイルにstartパラメータを渡す.
#!/bin/bash
for file in /etc/rc.d/rc3.d/K*; do
         echo '$file stop'   another way: echo -e "$file stop...........[\033[34mOK\033[0m]"  OK
done
for file in /etc/rc.d/rc3.d/S*; do
         echo '$file start'
done

練習9:スクリプトを書く
(1)Pingコマンドを用いるプローブ172.16.100.Xホストのオンライン状態;
#!/bin/bash
             for host in {1..254}; do
    ping -c1 -w1 172.16.100.$host
done

練習10:スクリプトを書く
(1)スクリプトにユーザ名を渡す.
(2)これらのユーザが属する基本グループのidの和を計算する.
#!/bin/bash
            declare -i GSUM=0
for username in $1; do
    GSUM=$[$GSUM+`id -g $username`]
done
echo the GID_SUM is $GSUM

五、forのいくつかの特殊な状況:
(1)forは省略し、スクリプトパラメータのリストを自動的に取得する.
(2)Cプログラミングスタイル:
for((変数付与;ループ条件;修正式);do
CMD1
CMD2
done
例えば、100以内の偶数の和を求める
#!/bin/bash
declare -i evensum=0
for ((i=2;i<=100;i+=2));do
let evensum+=$i
done
echo $evensum

(3)ループネスト:
for i in [LIST1]; do
CMD1
for j in [LIST2]; do
CMD2
...
done
done
練習11:スクリプトを書く
(1) ping 172.16.X.Y内の全てのホスト;
172.16.0-255.1-254
#!/bin/bash
for i in {0..255}; do
    for j in {1..254}; do
        ping -c1 -w1 172.16.$i.$j
    done
done

練習12:スクリプトを書く
(1)スクリプトにディレクトリを渡す.
(2)各ディレクトリの下のすべての一級ファイルの内容タイプを1つずつ表示する.
(3)1つに何個のディレクトリがあるかを統計する.全部で何個のファイルが表示されていますか.
#!/bin/bash
#
declare -i dirs=0
declare -i files=0
for d in $*; do
    for f in $d/*; do
        file $f
        let files++
    done
    let dirs++
done
echo "Directories: $dirs."
echo "Files: $files."
         :let dirs++  , , ; dir=[$dirs+1]

六、bashコマンド終了と終了ステータスコード
コマンドがbashで終了終了終了終了を実行すると、その実行が成功するかどうかは、終了ステータスコードによって記録することができる.
スクリプトの終了ステータスコードは、実行される最後のコマンドに依存します.カスタム終了ステータスコード:
exit #
成功:0
失敗:1-255
注意:スクリプトを早期に終了したり、exitコマンドを使用して実現したりすることができます.
たとえば、コマンドのステータスをスクリプトの終了ステータスコードとして使用します.
#!/bin/bash
#
ls /varr
retval=$?
echo "hello"
exit $retval
 :retval