ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

Linuxコマンドまとめ④ - シェルスクリプト

Linuxの勉強の4回目。今回はシェルスクリプトです。

シェルスクリプトとは・・・
シェルのコマンドラインをあらかじめ記述しておくファイルのこと

仕事で使う際によく書き方を忘れてしまうので、これを機に使う頻度が高いもの、これから使ってみたいものを整理しておきます。

シェルスクリプトの基本

・1行目にシバン(スクリプトを実行するシェルを指定)を記載
  #!/bin/bash

・chmodで実行権限を与える

・以下のコマンドでシェルスクリプトを実行
  $ ./スクリプトのファイル名(.sh)

・変数の宣言は不要
 <変数名>=値 で代入可能 ※=の前後にスペースをつけないこと

・変数を参照するときは変数の前に$をつける ※代入時は不要

・変数名の区切りを明示するには${     }とする

 

位置パラメータ

コマンドライン引数を扱うための特別な変数

 $0     実行時のシェルスクリプト
 $1,2,3 …    コマンドラインの第1,2,3 …引数

$ ./test.sh A B C  # $1:A, $2:B, $3:C

 $#       引数の個数
 $@         引数をまとめて扱う

 

制御構造

if文

C言語等と同様、条件分岐

if [ コマンド1 ]; then
  # コマンド1が真の場合の処理 elif [ コマンド2 ]; then   # コマンド2が真の場合の処理 elif [ コマンド3 ]; then   # コマンド3が真の場合の処理 else   # 上記判定すべてが偽の場合の処理 fi
 
評価演算子

・文字列
str1 = str2        str1とstr2が等しい
str1 != str2       str1とstr2が等しくない
-n str1              str1が空文字列でない
-z str1               str1が空文字列である

・整数
int1 -eq int2         int1 = int2
int1 -ne int2         int1 ≠ int2
int1 -lt int2           int1 < int2
int1 -le int2          int1 ≦ int2
int1 -gt int2          int1 > int2
int1 -ge int2         int1 ≧ int2

・ファイル属性
-e file                 fileが存在
-d file                 fileが存在し、ディレクトリである
-h file                 fileが存在し、シンボリックリンクである
-f file                  fileが存在し、通常のファイルである
-r file                  fileが存在し、読み出し可である
-w file                 fileが存在し、書き込み可である
-x file                  fileが存在し、実行可である
file1 -nt file2      file1の変更時刻がfile2より新しい
file1 -ot file2      file1の変更時刻がfile2より古い

 

結合演算子

条件式1 -a 条件式2               条件式1 AND 条件式2
条件式1 -o 条件式2               条件式1 OR 条件式2
!条件式                                  条件式の真偽を逆にする(NOT)
()                                            条件式をグループ化する
コマンド1 && コマンド2      コマンド1が正常終了したときだけコマンド2を実行
コマンド1 || コマンド2         コマンド1が正常終了しなかったときだけコマンド2を実行

 

for文

C言語と同様、ループ処理
リストの中1つ1つに対してdoからdoneの間を繰り返し処理する

for 変数名 in リスト
do
   # 繰り返す処理
done

※リストにはパス名展開(*.txtなど)や数値列を作成するseqコマンドなどが使用できる

 

case文

C言語におけるswitch文に近い
指定の文字列がパターンにマッチするかを判断し、マッチしたパターンに
対応する処理を行う

case <文字列> in
    <パターン1>)
          # 処理1
          ;;
    <パターン2>)
          # 処理2
          ;;
esac

※<パターン>には*, ?も使用可能 |を使用し、OR条件にすることもできる

 

while文

C言語と同様、指定した条件が真である限り繰り返し処理をする
コマンドが真の間だけループを回す

while <コマンド>
do
         # 繰り返し処理
done

 

シェル関数

シェルスクリプト内で使用する関数を定義できる ※使うより前に定義が必要

<関数名> ()
{
       # 処理
}

 

変数

明示しなければグローバル変数になる
関数内だけのローカル変数とするには変数の前にlocalをつける

 

その他シェルスクリプトでよく使うコマンド

xargsコマンド

標準入力に対し、指定したコマンドを実行
 $ xargs <実行したいコマンド>
  
→<コマンド> [標準入力から受け取った引数リスト] という形に変換

よく使う例)
カレントディレクトリ以下の全てのファイルに対してgrep実行

$ find . -type f | xargs grep <キーワード>

 

basenameコマンド

パス名からパスの部分を取り除いてファイル名だけを取り出す
 $ basename <パス名>