#author("2021-10-10T02:46:58+00:00","default:wikiadmin","wikiadmin") -とかく忘れがちなシェルプログラミングの文法などのまとめ #contents -bashとかは便利だけど常に入っているとは限らない。どこでも使えるshで組むのが基本 *注意事項 [#v5834160] スペースの有無でエラーになったりするので注意 たとえばif文は -これはOK if [ $# -ne 2 ]; then -]の前にスペースがなく、これだけでNG if [ $# -ne 2]; then *引数の処理 [#j2ee8047] **デフォルト値の設定 [#p7f82229] -設定されていないときにhogeが初期値となる。 $ARG1=${1:-hoge} ARG1=${1:-hoge} **引数を取得 [#qa0fe686] 引数は順番に$1,$2,$3・・・・と取得できる -一つ目の引数を表示 echo $1 **4番目以降の引数を一気に取得 [#w6f15015] VARIABLE_ARGS=${@:4} **コマンド引数チェック [#na889800] -引数のNULLチェック # nullだったら実施するパターン if [ ! $1 ]; then echo "PLEASE INPUT ARGUMENTS!" fi; -2個でなかった場合使用方法を表示して抜けるサンプル if [ $# -ne 2 ]; then echo "利用方法 $0 引数1 引数2" exit fi **変数の長さ [#q2e8e481] ${#変数名} *繰り返し処理 [#pe2c0147] **繰り返し処理 基本 [#xa1ee348] -a b cを一行ずつ表示する for FILE in a b c do echo ${FILE} done **繰り返し処理 コマンド実行結果[#v9cf52d9] TARGET_FILES=`ls *` for FILE in ${TARGET_FILES} do echo ${FILE} done #こっちのほうが楽? for textfile in $( ls . ); do echo "${textfile}" done -複数の決まっているファイルを処理したい場合は"a b c"の様に空白で区切って入れる。 **ファイルを読み込んで繰り返し(catはメモリ食うのでNG) [#r5fd28de] while read x; do echo $x done < $1 **繰り返し処理応用バージョン ファイルの中身を読み込んで処理 [#uc4c1e0a] -行の中にタブ空白が含まれない場合 for filename in `cat ファイル名` do echo $filename done -行の中にタブ空白が含まれる場合はこちら while read line ; do echo ${line} done < ファイル名 *if文 [#cfe30026] -基本構文 if [ -f $RESULT ]; then echo "TRUE" else echo "FALSE" fi; -else if はelifになる。 if [ -f $RESULT ]; then echo "TRUE" elif [ 条件 ]; then echo "FALSE" else echo "FALSE" fi; -文字列比較 if [ $STR = "比較対象" ]; then -ファイルが存在したらその中身を変数に入れる if [ -f $RESULT ]; then PRE_RESULT=`cat $RESULT` fi; -ファイルが存在しない場合のチェック if [ ! -f $RESULT ]; then PRE_RESULT=`cat $RESULT` fi; -空変数チェック if [ -z "${WEBAPPS}" ]; then echo "変数が空です" fi -ディレクトリ存在チェック、なければ処理をしない if [ ! -d "/var/tmp" ]; then echo "/var/tmp does not exist!" return fi -複数条件 if [ ! -d "/var/tmp" -o ! -d "/var/tmp2" ]; then echo "/var/tmp or /var/tmp2 do not exist!" return 1 fi *case文 [#yf89cecd] -キーから文字を読み込んで分岐させる処理、Javaと違ってcaseの内部でbreakは不要。 #!/bin/bash # read key input from stdin read key # do command case "$key" in "1" ) echo "statement1" echo "statement2";; "2" ) echo "end sign is ;;";; *) echo "一致するものがないときはここ" break ;; esac **コマンドを実行してリターンコードの判定例 [#c56d26a1] -lsを実行して失敗したらメッセージを出す例 ls hoge if [ $? -ne 0 ]; then echo "ERROR!!" exit fi; *関数(サブルーチン、プロシージャ)の定義 [#i18840e1] # 引数は$1,$2でつかえる。呼び出し前に定義しておく必要がある。 doCheck() { echo $1 } # 呼び出しは関数名と引数をスペース区切りで doCheck hogehogehoge fugafuga -関数だけ作ったファイルを外だししておくと便利。呼び出すにはsourceを使う source ./function.sh *応用編(上記の合わせ技) [#baa83301] -引数チェック、ディレクトリ判定、ファイルループなど。引数3つでコピー元ディレクトリ、コピー先ディレクトリ、コピーファイルリスト。コピー先に存在しないディレクトリは作成し、コピーはコマンドで表示するので安全かと。 #!/bin/sh SRC_DIR=$1 DST_DIR=$2 LIST=$3 if [ -z "$1" -o -z "$2" -o -z "$3" ]; then echo "コピー元、コピー先、ファイル名の引数のいずれかが空です。" exit 1 fi while read line ; do DIR_NAME=`dirname ${line}` if [ ! -e "${DST_DIR}${DIR_NAME}" ]; then mkdir -p ${DST_DIR}${DIR_NAME} fi FILE_NAME=`filename ${line}` echo cp ${SRC_DIR}${line} ${DST_DIR}${line} done < ${LIST} *その他 [#l7a527c4] **ファイルに日付時刻の接尾語をつける。 [#w7c8d094] SUFFIX=` date '+%Y%m%d%H%M%S'` echo "TEST" > hoge_${SUFFIX} -フォーマットするなら以下のようにする(ファイル名には不適切かも) date '+%Y-%m-%d %H:%M:%S' #counter