Linuxシェルスクリプト入門:基本コマンドとスクリプト作成

1. 16の基本コマンド


1. ファイルの所有者変更:(sample.txtの所有者をdb_userに変更し、ls -lで確認)
    chown db_user:db_group sample.txt
    
2. 現在のユーザーに実行権限を追加し、ls -lで確認:
    chmod u+x sample.txt

3. ファイルの差分を確認:
    diff file_a.txt file_b.txt
    
4. ファイルの位置を検索:
    find ./ -name sample.txt
    
5. プロセスを終了させる:
    kill -9 12345
    
6. sample_userユーザーの全プロセスを終了させる:
    ps -ef | awk '$1=="sample_user"{print $2}' | xargs kill -9
    
7. 現在の時刻を表示:
    date 
    
8. 現在のユーザーを確認:
    id
    
9. ホスト情報を表示:
    uname -a
    
10. rootユーザーでsample_userのパスワードを変更:
    passwd sample_user
    
11. ディスク使用量を確認:
    df -h
        
12. 現在のディレクトリを表示
    pwd

13. 標準出力(printと同様):
    echo 'Hello World'
    
14. ファイルの最初の10行を表示
    head -10 sample.txt
    
15. ファイルの最後の10行を表示
    tail -10 sample.txt
    
16.viエディタの基本操作
    ESCキーを押した後:
        x:1文字削除
        dd: 1行削除
    ボトムラインモード:
        行番号の表示: set nu
        検索:/検索文字

2. ファイル権限に関するコマンド


1. 権限の文字表記:
    3つのカテゴリ:所有者、グループ、その他
    r:読み取り---4
    w:書き込み---2
    x:実行---1
    
2. 現在のユーザーに実行権限を追加し、ls -lで確認:
    chmod u+x sample.txt
    
3. ファイルの所有者変更:(sample.txtの所有者をdb_userに変更し、ls -lで確認)
    chown db_user:db_group sample.txt
    
4. 例:-rw-r--r-- 1 root root 68 Mar 27 00:40 script.sh
    所有者:root 権限:rw
    グループ:root 権限:r
    しかし、所有者rootはsh script.shでこのファイルを実行できます。なぜなら、読み取り権限があるからです。
    ./script.shで直接実行することはできません。
    実行するには、権限を付与する必要があります:chmod +x script.sh
    
5. スクリプトの実行方法:(./とshが推奨)
    読み取り権限(r)がある場合:
        sh script.sh
        bash script.sh
        source script.sh
        
    実行権限(x)がある場合:
        sh script.sh
        bash script.sh
        source script.sh
        ./script.sh  
    
6. .shスクリプトの仕組み:
    ファイルの内容を読み取り、その中のコマンドを実行するだけなので、読み取り権限さえあれば実行できます。

3. シェルの演算子


1. 演算子>
    ファイルの内容を削除し、新しい内容を追加します。catとよく組み合わせて使用します。
    cat > sample.txt
    (改行して内容を入力)
    
2. 演算子>>
    ファイルの内容を削除せずに、文字列を追加します。catとよく組み合わせて使用します。
    cat >> sample.txt
    (改行して内容を入力)
    
3. 演算子;
    複数のコマンドを順番に実行します。
    cat sample.txt ; ls
    
4. 演算子|
    パイプライン:| はパイプを意味し、前のコマンドの出力を次のコマンドの入力(引数)として渡します。
    cat sample.txt | grep 'hello'
    
5. 演算子&&
    前のコマンドが成功した場合にのみ、次のコマンドを実行します。
    cat sample.txt && ls
    
6. 演算子||
    前のコマンドが失敗した場合にのみ、次のコマンドを実行します。
    
7. 演算子""
    変数の値を出力します。
    echo "最初の変数は:$var"
    
8. 演算子''
    すべてを文字列として出力します。
    echo '最初の変数は:$var'
    
9. 演算子``
    バッククォート内のコマンドを評価します。
    a='date'  # 文字列として代入   echo $a  # 結果は'date'
    a=`date`  # コマンドとして実行   echo $a  # 結果は現在時刻
    
10. 無限穴(/dev/null)
    2>/dev/null  エラーメッセージを無限穴に送り、コンソールに表示されません。
    >/dev/null    正常出力を無限穴に送り、コンソールに表示されません。
    cat sample.txt 2>/dev/null 

4. 算術演算子


1. 式の結果を出力する3つの方法:
    expr 12 + 2
    echo $[12 + 2]
    echo $((12 + 2))
    
2. bc計算機を使用する(文字列をbcに渡して処理)
    echo "1.2+1.3" | bc            # 結果:2.5
    echo "scale=2;1.2+1.3" | bc    # 結果:2.5
    echo "scale=2;(1.2+1.3)/1" | bc    # 結果:2.50

5. 条件判断


    -e    対象が存在するか:    [ -e sample.txt ] || touch sample.txt
    -d    ディレクトリかどうか:     [ -d /var ] && echo '存在' 
    -f    ファイルかどうか
    
    -r    読み取り権限があるか:    [ -r sample.txt ] && echo '読み取り権限あり'
    -w    
    -x
        
    整数:
    -eq    等しい        [ 9 -eq 9 ] && echo '等しい'
    -ne    等しくない        
    -gt    大きい        
    -lt    小さい        
    -ge    以上    
    -le    以下    
    
    文字列:
    =    等しい    [ 'abc' = 'abc' ] && echo '等しい'
    !=    等しくない    
    
    小数:bc計算機を利用    [ `echo '1.2 > 1.3' | bc` -eq 1 ] && echo '大きい'
    
    一般的な使い方:
    [ $? -eq 0 ] 直前のコマンドが成功したかどうかを判断

6. readコマンド


readコマンド:
    -p プロンプトを表示
    -s 入力内容を隠す
    -t タイムアウト時間を設定(時間内に入力がなければreadを終了)
    -n 読み取る文字数を制限し、指定数に達すると自動的に実行

7. -e の機能


-e : エスケープシーケンスを有効にする:
    echo -e "
"
    `echo -e "\033[4;31m Hello: \033[0m"`

8. 大量データ処理:grep, awk, sed, cut

8.1 grep: 行操作


    -v : マッチしない行を表示
    -n : 行番号と内容を表示
    -w : 完全一致
    -i : 大文字小文字を区別しない
    ^  : 行の先頭にマッチ
    -E : 正規表現マッチ
    
    123.shファイルから'user'を含む行を抽出
        grep 'user' 123.sh
        
    'user'で始まる行をマッチ
        grep '^user' 123.sh
        
    'user1'または'user2'または'user3'を含む行をマッチ
        grep -E 'user1|user2|user3' 123.sh

8.2 cut: 列操作


    -d : 区切り文字を指定(指定しない場合はタブで区切る)
    -f : 切り出すフィールドを指定
    -c : 文字単位で切り出す
    
    ':'を区切り文字として、123.shファイルの第1列と第3列を切り出す
    cut -d ':' -f 1,3 123.sh
    
    ':'を区切り文字として、123.shファイルの第1列から第3列を切り出す
    cut -d ':' -f 1-3 123.sh
    
    ':'を区切り文字として、123.shファイルの第2列から最終列を切り出す
    cut -d ':' -f 2- 123.sh
    
    123.shファイルの2文字目から9文字目を切り出す
    cut -c 2-9 123.sh
    
    例:
    システムにログイン可能な一般ユーザー(rootを除く)を抽出する
    grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v 'root'
    cat /etc/passwd | grep 'bin/bash' | cut -d ':' -f1 | grep -v 'root'

8.3 強力なawk:列操作


    awk [オプション] '条件{アクション} 条件2{アクション} ..' ファイル名
    オプションと条件は省略可能
    
    printf: フォーマット出力、自動改行なし
        \t:タブ 
        
: 改行
        %ns: 文字列  nは文字数
        %ni: 整数    nは桁数
        %.nf: 浮動小数点 nは小数点以下の桁数
        printf '%s\t%s\t%s\t%s
' 1 2 3 4 5
        
    print: 自動改行あり
    
    例:ディスク使用率を表示
        df -h | grep /dev/sda1 | awk '{printf "/dev/sda1の使用率:"} {print $5}'
        
        浮動小数点計算(最後の$0は全行を表す)
            echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f
",$0}'
            
            $0: 全行
            $1: 第1列
            $2: 第2列
            ...
        
    条件:
        -F: 区切り文字を指定:
            cat /etc/passwd | cut -d ':' -f 1
            cat /etc/passwd | awk -F":" '{print $1}' 
        
        BEGIN: ファイルの全内容を読み込む前に実行。通常、組み込み変数の値を変更するために使用。
        FS: BEGINで区切り文字を定義
            cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}' 
    
        END: 終了時に実行
            cat /etc/passwd | awk -F":" '{print $1} END{printf "以上が実行結果
"}' 
    
        NR: 行番号
            df -h | awk '(NR>=2 && NR<=5) {print $5}'
            awk '(NR>=2 && NR<=5) {print $5}' /etc/passwd
        
        行番号を表示:
            nl /etc/passwd | awk '(NR>=2 && NR<=5) {print $1}' 

8.4 sed:抽出、追加、検索、置換、削除


    sed [オプション] [アクション] ファイル名
        オプションとアクションは省略可能
    
        -n: マッチした行のみを表示
        p: 行単位で検索。通常-nと一緒に使用。
            2行目を表示:
            df -h | sed -n '2p'
            '2'を含む行を表示:
            df -h | sed -n '/2/p'
            
            
        d: 削除(元のファイルは変更されない)
            2行目を削除:
            df -h | sed '2d'
            テキストを新しいファイルに保存
            df -h > newdf.txt 
            sed '2d' newdf.txt
            
        a: 行の下に新しい内容を挿入(元のファイルは変更されない)
            sed '2a 123456789' newdf.txt
            
        i: 行の上に新しい内容を挿入(元のファイルは変更されない)
            sed '2i 123456789' newdf.txt
        
        c: 置換
            2行目を置換:
            sed '2c 123456789' newdf.txt
    
        s/str1/str2/g    str2でstr1を置換
            sed 's/0%/100%/g' newdf.txt
        
        -i: 元のファイルを直接変更(危険な操作、必ずバックアップを取る)
            sed -i 's/0%/100%/g' newdf.txt
        
        -e: 複数のアクションを実行可能
            検索と置換、表示の2つのアクションを同時に行う例
            cat newdf.txt | sed -n -e 's/0%/100%/g' -e '/100%/'
    
    検索方法:
        sed -n '/100%/p' newdf.txt
        cat -n newdf.txt | sed -n '/100%/p'
        
    以前学んだgrepでの検索:
        cat -n newdf.txt | grep 100%

9. ループ処理

9.1 if文


1.  if [条件];
        then
        アクション
    fi
    
    
2.  if [条件];
        then
        アクション
    else
        アクション
    fi
    
    例:入力ファイルが存在するかどうかを判断
        #!/bin/bash
        if [ -e $1 ];
                then
                echo "$1が存在します"
        else
                echo "$1が存在しません"
        fi

        
            
3.  if [条件];
        then
        アクション
    elif [];
        アクション
    fi    

    例:入力された数字が10より大きいかどうかを判断
        #!/bin/bash
        echo '数字を入力してください:'
        read number
        if [ $number -eq 10 ];
            then
            echo "$number は10に等しい"
        elif [ $number -gt 10 ];
            then 
            echo "$number は10より大きい"
        else
            echo "$number は10より小さい"
        fi    

9.2 forループ


    1. 形式:
        for 変数名 in 値1 値2 ....
        do
        アクション
        done
        
        例:1から10までを表示
        #!/bin/bash
            for i in 1 2 3 4 5 6 7 8 9 10
            do 
            echo $i
            sleep 1
            done
    
    
    
    2. 形式
        for 変数名 in `コマンド`
        do
        アクション
        done
        
        例:1から100までを表示
            #!/bin/bash
            for i in `seq 1 100`
            do 
            echo $i
            done
        
        例:baiduに2回pingを送り、通れば終了
            #!/bin/bash
            for i in $(cat host_list.txt)
            do 
            ping -c  2 $i
            echo -e "
"
            done
        
        host_list.txtの内容例
        www.example.com
        www.test.com
        
    3. 形式:
        for ((条件))
        do
        アクション
        done
        
        例:1から10までを表示
            #!/bin/bash
            for ((j=1; j<=10; j++))
            do
            echo $j
            sleep 1
            done

9.3 case文:(パターンマッチング)


    1. 形式:(;;は処理終了を意味)
        case 変数 in 
            値1 )
            アクション
            ;;
            
            値2 )
            アクション
            ;;
            
            値3 )
            アクション
            ;;
            
            ...
        esac
    
    例:都市の天気を照会
        echo '都市名を入力してください'
        read city
        case $city in 
            'Tokyo')
            echo "$cityの気温は23度、暑いです"
            ;;
            'Osaka')
            echo "$cityの気温は24度、暑いです"
            ;;
            'Fukuoka')
            echo "$cityの気温は25度、暑いです"
            ;;
            *)
            echo "入力が間違っています"
            ;;
        esac

9.4 whileループ


    1. 形式:
        while [ 条件式 ]
        do
        アクション
        done
    
        例:0からnまでの和を計算
            #!/bin/bash
            j=0
            sum=0
            while [ $j -le $1 ]
            do
            sum=$((sum+j))
            j=$((j+1))
            done
            echo '合計は:'$sum

タグ: linux Shell bash コマンド シェルスクリプト

5月20日 13:36 投稿