Linuxコマンドまとめ④ - シェルスクリプト
シェルスクリプトとは・・・
シェルのコマンドラインをあらかじめ記述しておくファイルのこと
仕事で使う際によく書き方を忘れてしまうので、これを機に使う頻度が高いもの、これから使ってみたいものを整理しておきます。
シェルスクリプトの基本
・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 <パス名>