#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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS