linux学習31運次元コアスキル-shellスクリプト論理判断とパラメータ伝達

19214 ワード

一、bashスクリプトプログラミング
1、ファイルテスト
a、存在性テスト
      -a FILE
      -e FILE
ファイルの存在性テスト、存在すれば真、存在しなければ偽
[root@node1 ~]# [ -e /etc/rc.d/rc.sysinit ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ -e /etc/rc.d/rc.local ]
[root@node1 ~]# echo $?
0

b、存在性及び類型テスト
-b FILE:存在し、ブロックデバイスファイルであるか
[root@node1 ~]# [ -b /dev/sda ]
[root@node1 ~]# echo $?
0

-c FILE:存在し、文字デバイスファイルであるか
-d FILE:ディレクトリファイルとして存在するか
-f FILE:存在し、通常のファイルであるか
-h FILEまたは-L FILE:シンボルリンクファイルとして存在するか
-p FILE:存在し、名前付きパイプファイル
-S FILE:ソケットファイルが存在するか
c、ファイル権限テスト
-r FILE:存在し、現在のユーザーに対して読み取り可能であるか.
-w FILE:存在し、現在のユーザーに対して書き込み可能
-x FILE:存在するか、現在のユーザーに対して実行可能
d、特殊権限テスト
-u FILE:suid権限があるかどうか
-g FILE:sgid権限があるかどうか
-k FILE:stlcky権限があるかどうか
e、ファイルに内容があるか
-s FILE:ファイルに内容があるかどうか、あるなら真、ないなら偽
[root@node1 ~]# touch /tmp/testfile
[root@node1 ~]# [ -s /tmp/testfile ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# echo "wohaoshuai" >> /tmp/testfile 
[root@node1 ~]# [ -s /tmp/testfile ]
[root@node1 ~]# echo $?
0

f、ファイルのタイムスタンプをテストする
-N FILE:ファイルは前回の読み込み操作から変更されたか
g、従属関係テスト
-O FILE:現在のユーザーがファイルの所有者であるか
-G FILE:現在有効なユーザーがファイルのグループに属しているか
h、両目テスト
FILE 1-ef FILE 2:ファイル1とファイル2が同じファイルシステム上の同じinodeへのハードリンクであるかどうか
FILE 1-nt FILE 2:FILE 1がFILE 2より新しいかどうか
FILE 1-ot FILE 2:FILE 1がFILE 2より古いかどうか
2、組合せ試験条件
a、論理演算
1つ目の方法:
        COMMAND1 && COMMAND2
        COMMAND1 || COMMAND2
        !COMMAND
        [ -O FILE ] && [ -r FILE ]
2つ目の方法:
EXPRESSION 1-a EXPRESSION 2#と演算
EXPRESSION-o EXPRESSION 2#または演算
        !EXPRESSION
        [ -O FILE -a -x FILE ]
3、練習:
a、現在のホスト名をhostName変数に保存する、ホスト名が空の場合、またはlocalhostである.localdomain、www.wohaoshuaiに設定します.com;
      hostName=$(hostname)
      [ -z "$hostName"-o "$hostName"=="localhost.localdomain"-o "$hostName"=="localhost"] && hostname www.wohaoshuai.com
二、スクリプトにパラメータを渡す方法
1、位置パラメータ変数
    myscript.sh argu1 argu2
a、引用方式:
      $1,$2,...${10},${11}...
[root@node1 script]# cat sum.sh 
#!/bin/bash
#
echo $[$1 + $2]
[root@node1 script]# bash sum.sh 2 3
5

b、交代.shift[n]:位置パラメータが入れ替わります.
[root@node1 script]# cat shift.sh 
#!/bin/bash
echo "First and second pos argu: $1,$2"
shift 2 # , $1 , 
echo "Third pos argu $1"
[root@node1 script]# bash shift.sh one two three
First and second pos argu: one,two
Third pos argu three

c、練習:スクリプトを書き、コマンドラインを通じて2つのテキストファイルのパスをスクリプトに渡し、空白の行数の和を計算する
[root@node1 script]# cat lines.sh 
#!/bin/bash
file1_lines=$(grep "^$" $1|wc -l)
file2_lines=$(grep "^$" $2|wc -l)

echo "Total blank lines:$[$file1_lines+$file2_lines]"

[root@node1 script]# bash lines.sh /etc/fstab /etc/issue
Total blank lines:2

2、特殊変数
$0:スクリプトファイルパス自体
[root@node1 script]# cat filename.sh 
#!/bin/bash
echo $0
[root@node1 script]# bash filename.sh 
filename.sh

$#:表示パラメータ数
[root@node1 script]# cat pos.sh 
#!/bin/bash
echo "$1,$2"
echo $#
[root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
wohaoshuai1,wohaoshuai2
2
[root@localhost script]# cat lines.sh 
#!/bin/bash
[ $# -lt 2 ] && echo "At least two file" && exit 1
file1_lines=$(grep "^$" $1|wc -l)
file2_lines=$(grep "^$" $2|wc -l)

echo "Total blank lines:$[$file1_lines+$file2_lines]"
[root@localhost script]# bash lines.sh /etc/fstab 
At least two file
[root@localhost script]# echo $?
1

$*:すべてのパラメータ
      "hello"  "hi"  "toyou"
$@:すべてのパラメータ
      "hello hi toyou"
[root@node1 script]# cat pos.sh 
#!/bin/bash
echo "$1,$2"
echo $#
echo $*
echo $@
[root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
wohaoshuai1,wohaoshuai2
2
wohaoshuai1 wohaoshuai2
wohaoshuai1 wohaoshuai2

三、条件判断
1.プロセスプログラミング言語のコード実行順序
a、順次実行:逐条実行
b、実行を選択する:
コードにはブランチがあります.条件が満たされた場合にのみ実行されます.
2つ以上のブランチ:条件を満たすブランチの1つのみが実行されます.
c、循環実行:
コードクリップ(循環体)0、1または複数の往復を実行するには
2、書き方
a、実行の選択
(1)、単一ブランチのif文:
if試験条件;then
ブランチ
        fi
(2)、二重ブランチのif文:
if試験条件;then
条件は、実際に実行されたブランチです.
        else
条件が偽の場合に実行されるブランチ
        fi
例:パラメータを使用してスクリプトにユーザー名を渡します.このユーザーが存在しない場合に追加します.
[root@localhost script]# cat useradd.sh 
#!/bin/bash
if ! grep "^$1\>" /etc/passwd &> /dev/null;then
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished."
fi
[root@localhost script]# bash useradd.sh hbase
Add user hbase finished.
[root@localhost script]# cat useradd.sh 
#!/bin/bash
if [ $# -lt 1 ];then
    echo "At least one username."
    exit 2
fi
if ! grep "^$1\>" /etc/passwd &> /dev/null;then
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished."
fi
[root@localhost script]# bash useradd.sh 
At least one username.
[root@localhost script]# echo $?
2
[root@localhost script]# cat useradd.sh 
#!/bin/bash
if [ $# -lt 1 ];then
    echo "At least one username."
    exit 2
fi
if  grep "^$1\>" /etc/passwd &> /dev/null;then
    echo "User $1 exists"
else
    useradd $1
    echo $1 |passwd --stdin $1 &> /dev/null
    echo "Add user $1 finished."
fi
[root@localhost script]# bash useradd.sh hbase
User hbase exists

3、練習
a、コマンドラインパラメータで2つの数字を与え、その中の大きい数字を出力する
[root@localhost script]# cat big.sh 
#!/bin/bash
if [ $# -lt 2 ];then
    echo "Two intergers"
    exit 2 
fi
if [ $1 -ge $2 ];then
    echo "Max number; $1."
else
    echo "Max number; $2."
fi
[root@localhost script]# chmod +x big.sh 
[root@localhost script]# ./big.sh 4 6
Max number; 6.
[root@localhost script]# ./big.sh 4 
Two intergers
[root@localhost script]# cat big.sh 
#!/bin/bash
declare -i max 
if [ $# -lt 2 ]; then
    echo "Two intergers"
    exit 2 
fi
if [ $1 -ge $2 ];then
    max=$1
else
    max=$2
fi
echo $max
[root@localhost script]# bash big.sh 4 6
6

b、コマンドラインパラメータにより1つのユーザ名を与え、そのID番号が偶数か奇数かを判断する
c、コマンドラインパラメータで2つのファイル名を指定し、あるファイルが存在しない場合、スクリプト実行を終了する.すべてが存在する場合、各ファイルの行数を返し、行数の多いファイルを説明します.