if [ "$num" -lt 100 ]; then
echo "100 未満"
elif [ "$num" -ge 100 -a "$num" -lt 200 ]; then
echo "より大きい100 以上 200 未満"
elif [ "$num" -ge 200 -a "$num" -lt 300 ]; then
echo "200 以上 300 未満"
else
echo "その他の数値"
fi
5. wihle ループ
1.
を理解する 条件が true の場合、プログラムはコマンドのリターン コードをテストします。 while ループ本体の命令 0 は true です。ループ本体は次のとおりです。
while [] --while そして [ ] コマンドを実行し、[ ] コマンドの戻りコードをテストします
cat /filename while read line --while and then読み取りコマンドを実行し、読み取りコマンドのリターン コードをテストします。 リターン コード
do
....
done
2. ループ制御ステートメント
continue -- 現在のループを終了し、次のループを開始します。 one
break -- 現在のループを終了して終了します ループ本体
exit -- 現在のスクリプトを終了します
3. 例
# vim test.sh -- continue と Break の違いを区別します
#!/bin/bash
while true
do
sleep 1
echo test
continue/break
echo
done
# vim test.sh --break と の違いを区別するexit
#!/bin/bash
while test - e /data/test/test.sh
do
echo "exists"
sleep 1
break/exit
done
echo "loop end"
# vim test.sh -- 指定したパスが見つかるまで探します
# !/bin/bash
if test $# -ne 1;then
echo "wrong paraneter" >&2
exit
fi
path=$1
while test ! do
sleep 1
echo "don't found!!!"
done
echo "found"
# vim test.sh
-- スクリプトは指定された時間だけ実行され、時間が経過すると終了します; s
#!/bin/bash
if test $# -ne 1;then
echo "Usage: $(basename $0) TIME" >&2
exit 1
fi
timeLength =$1
beginTime=$(date +%s)
endTime=$(( $beginTime + $timeLength ))
--------------------- -- ----------------------------------
テスト中 $(date +%s) -lt " $endTime "
do
echo "処理中...."
スリープ1
完了
---------------------- - ----------------------------------
while true
do
if test $(date + %s) - ge "$endTime";then
break
fi
echo "processing...."
sleep 1
done
------------------------------------------------- --------
echo "time out"
# vim test.sh --ファイルの各行をループし、各行の文字数をカウントします
#!/bin/bash
file=$1
------------------------------------------ ------ ---------------
totalLines=$(wc -l < $file)
line=1
while test $line -le $totalLines
do
lineData= $(sed -n "${line}p" $file)
len=$(echo -n $lineData | wc -c)
echo "line ${line}: $len "
line=$( ( $line + 1 ))
完了
---------------------------- ---------- ------------------
line=1
while read lineData
do
len=$(echo $lineData | wc -c)
echo "line ${line}: $len"
line=$(( $line + 1 ))
done < $file
---------------------------------------------------- -
# vim test.sh -- hello world; <(seq 10) はプロセス置換
#!/bin/bash
の読み取り中に 10 行を出力します。
do
「hello world」をエコー
done <<(seq 10)
------------------------------------- -------- -----------------------
n=1
while [ $n -le 10 ]
do
「hello world」をエコーします
n=$((n+1))
完了
------------------------------------- -------- -----------------------
# vim test.sh -- 無限ループを作成し、1 分間実行した後にループが自動的に終了するように要求します
#!/bin/bash
start_time=$(date +%s)
while true
do
cur_time=$(date +%s)
test $((cur_time - start_time)) -ge 10 && Break
time=$((cur_time - start_time))
echo "時間は $time です。 . ...."
sleep 1
done
# vim test.sh -- まず while ループを使用して 100 個の .txt ファイルを作成し、次にすべてのファイルのサフィックスを .html
# に変更します。 /bin /bash
count=100
-------------------------------------- -- ----------------
seq $count | 読み取り中 i
do
${i}.txt
done
ls -1 *.txt | 読み取り中 oldname
do
newname=$(echo $oldname | sed 's/.txt$/.html/')
mv $oldname $newname
---- -------------------------------------------------- -- -
読みながら i
do
${i}.txt
done < <( seq $count )
読みながら oldname
do
newname=$(echo $ oldname | sed 's/.txt$/.html/')
mv $oldname $newname
done <(ls -1 *.txt )
# vim test.sh
--計算1000 パイプは num
do の読み取り中にサブプロセスを生成するため、パイプ内の偶数の合計は使用できません。
sum=$(( $sum + $num ))
done < <(seq 2 2 998)
echo "sum: $sum "
# vim test.sh --100 件のメールを一括追加ユーザー、ユーザー名は u1 ~ u100、パスワードは abc、ログイン シェルは /sbin/nologin、メール グループ
#!/bin/bash
password=abc
group=email
grep -Eq にのみ属します。 " ^${group}:" /etc/group || 読み取り中 i
do
useradd u${i} -N -g $group -s /sbin/nologin
passwd u$ { i} --stdin <<< "$password"
done < <(seq 100)
# vim test.sh
-- 作成した 100 人のメール ユーザーをバッチで削除します
# ! /bin/bash
while read i
do
userdel -r u${i}
done < 開いた文字列から一度に 1 つずつ取り出し、完了するとループが終了します。
毎回取り出した文字列は変数に保存され、ループ本体内で使用できます
区切り文字による分割された文字列は以下の方法で提供できます:
1. ループする文字列を手動で入力します。指定された回数
# vim test.sh
#!/bin/bash
for i in 1 2 3
do
echo $i
don
2。変数
# vim test.sh
#!/bin/bash
FILES="/bin/bash /bin /ls /bin/cat"
$FILES のファイル用
do
echo $ファイル
完了
3. プログラムで生成された文字列
# vim test.sh
#!/bin/bash
for n in $(seq 11)
echo $n
完了
4. シェル拡張によって生成され、ディレクトリ内のファイルをループします
# vim test.sh
#!/bin/bash
for f in /etc/init.d/*
do
echo $f
done
# vim test.sh
5. /dev
# vim test.sh
#!/bin/ bash
の下にあるloopで始まるすべてのファイルのファイル名を出力します。
for file in /dev/loop*
do
echo $(basename $file)
done
6. 1000以内の偶数の合計を計算します
# vim test.sh
#!/ bin/bash
sum=0
for number in $(seq 2 2 998)
do
sum=$(( $sum + $number ))
done
echo "total: $ sum"
7. 100 人の電子メール ユーザーを一括で追加します。ユーザー名は u1 から u10、パスワードは abc、ログイン シェルは /sbin/nologin で、電子メール グループのみに属します
# vim test.sh
#!/ bin/bash
function checkGid() {
gid=$1
if ! grep -qE "^$gid:" /etc/groupadd $gid
fi
}
関数 isRoot( ) {
id=$(id | awk -F "[=(]" '{print $2}')
if test "$id" -ne 0; then
echo "must be root" >&2
exit 1
fi
}
count=10
namePrefix=u
password=abc
shell=/sbin/nologin
gid=email
isRoot
checkGid $gid
$( の数値seq $count)
do
name=${namePrefix}${num}
useradd $name -s $shell -g $gid &> /dev/null
if test $?ne 0;
echo "$name の作成に失敗しました" >&2
else
echo "$name"
echo "$password --stdin $name" &> /dev/null
if テスト$? -ne 0; then
echo "$name のパスワードの変更に失敗しました" >&2
else
echo "パスワードが正常に変更されました -- $name"
fi
fi
完了
8 , LAN内のすべてのコンピューターのIPアドレスとMACアドレスの対応表を取得します
# vim test.sh
#!/bin/bash
ipPrefix=192.168.1.
startIp=1
endIp=254
for num in $(seq $startIp $endIp)
do
ip=${ipPrefix}$num
ping -W1 -c1 $ip &>/dev/null &
done
wait
arp - n '/incomplete/d' | awk '{print $1,$3}' '.' -k4,4 |
9. 乗算表を出力します
# vim test.sh
#!/bin/bash
for row in $(seq 9)
do
forcol in $(seq $row)
do
echo -n "${col}x${row}=$(( $col * $row )) "
done
echo
done | 簡単な計算 デバイス
#!/bin/bash
varnum=3
if test "$#" -ne "$varnum"; then
echo "間違った引数" >&2
exit 1
fi
num1 =$1
num2=$3
operator=$2
if test "$operator" = "x";then
operator="*"
fi
if test "$operator" = "/" - a "$num2" = 0; then
echo "0 による除算" >& 2
exit 1
fi
result=$(( $num1 $operator $num2 ))
echo "$result"
注: 乗算処理; 被除数が 0 の場合の処理
11. 指定されたディレクトリ内の特定のファイルを指定されたディレクトリにコピーします。 要件:
#1. コマンドラインから 2 つのパラメーターを受け取ります。ソース ディレクトリとターゲット ディレクトリをそれぞれ
#2。ソース ディレクトリが存在しない場合は、エラーが報告されます
#3。ターゲット ディレクトリが存在しない場合は、ターゲット ディレクトリを作成します
#4。ただし、ディレクトリではなく、単なるエラー レポートです
#5。通常のファイルとソフト リンク ファイルのみをコピーします
#6。通常のファイルの場合は、サイズが 1M 未満のファイルのみをコピーします
# vim /test.sh
# !/bin/bash
function displayHelp()
{
echo "使用法: $(basename $0) SRCDIR DSTDIR"
}
function getSize()
{
file=$1
size=$(ls -l $file | awk '{print $5}')
echo $size
}
if test $# -ne 2;次に
displayHelp >&2
exit 1
fi
srcdir=$1
dstdir=$2
if test! -d "$srcdir"; then
echo "$srcdir が存在しないか、ディレクトリではありません" >&2
exit 1
fi
if test ! -e "$dstdir"; then
mkdir "$dstdir"
fi
ifテスト! -d "$dstdir"; then
echo "$dstdir はディレクトリではありません" >&2
exit 1
fi
for file in $srcdir/*
do
if test -L $file; then
cp -a $file $dstdir/
elif test -f $file;それでは
----------------------------------------------- ----
size=$(getSize $file)
if test "$size" -lt 1048576; then
cp -a $file $dstdir/
fi
--------------------------------- ----------
find $file -type f -size -1024k -exec cp -a {} $dstdir/ ;
-------- ---------------------------------------
fi
完了