シェルチートシート
シェルのifの条件で2つの条件がある場合はand条件を使います。
シェルではand条件は-aを使用します。
以下、0以外、かつ、1以外の条件の例です。
if [$RET -ne 0 -a $RET -ne 1];then ~ fi
if文
シェルのif構文です。
if 条件式; then elif 条件式; then else fi
シェルの半角スペース
シェルでは半角スペースは区切り文字として意味のある文字として扱われます。
半角スペースはIFS(Internal Field Separator)に区切り文字として設定されています。
その為以下のようなファイルがあると思わぬ動作をしてしまいます。
aaa,bbb,Program Files,100,200
このファイルをシェルのfor文でループすると、半角スペースを区切り文字(改行)と見なし、2回ループされます。
for $i in `cat a.csv` do echo "$i" done
これを防ぐには、環境変数IFSをシェル内でLFに設定します。
IFS=$'\n' # ←この1行を追加 for $i in `cat a.csv` do echo "$i" done
シェルの演算子-eqと-ne
シェルのif文で=と≠の判断をするときに-eqと-neを使います。
-eqはequal、-neはnot equalの略です。
以下、使い方の例です。
if [$RET -eq 2];then #処理 elif [$RET -ne 2];then #処理 fi
シェルでexec > ファイル名 2>&1
シェルで
exec > ファイル名 2>&1
と記述すると、標準出力、標準エラー出力が上記のファイル名に出力されるようになります。
シェルでディレクトリ配下のファイルを全削除する
シェルでディレクトリ配下のファイルを全削除する例です。
rm *
今使用しているシェルを調べる
今使用しているシェルを調べるには
echo $SHELL
と打つとわかります。
linuxでファイルを検索する
linuxでファイルを検索するコマンドです。
find . -name 対象ファイル名 -print
.はカレントディレクトリ配下を探す意味です。
対象ファイル名は*aaなどとすると、末尾がaaのファイルを探すことができます。
-printとすることでファイル名を出力してくれます。
$(cd $(dirname $(cd $(dirname $0) && pwd)
) && pwd)
シェルのワンライナーでdirname $0というのを良く見ます。
以下のようなディレクトリ構成でシェルがあるとします。
/test1/test2/test3/a.sh
$0というのはechoするとわかると思いますがシェルスクリプトファイル名(フルパス)を表します。
上記では
/test1/test2/test3/a.sh
を表します。
dirname $0とすると、$0のディレクトリ部分を表します。
/test1/test2/test3
以下は、よく見るワンライナーです。
cd $(dirname $0) && pwd
&&は左辺のコマンドが実行されれば右辺を実行するので、上記のワンライナーは以下を順次実行しているのと同じになります。
cd /test1/test2/test3 pwd
シェルスクリプトファイル内で以下を記述すると、変数にシェルスクリプトファイルのカレントディレクトリを格納します。
CURRENT=$(cd $(dirname $0) && pwd)
ls -l | grep
ls -l | grep 対象文字列
上記でlsコマンドの結果から対象文字列が含まれる行のみが表示されます。
対象文字列はシングルクォーテーションで囲っても囲まなくても一緒です。
期待してないtoken fiのあたりにシンタックスエラー
シェルを作成していると「期待してないtoken fiのあたりにシンタックスエラー」というエラーが出たりします。
これの原因はif文の分岐でなにも処理を書いていないと、このエラーが発生します。
分岐する以上は何かしら処理を記述しなくてはいけません。
シェルでzipファイルを解凍する
シェルでzipファイルを解凍するには、unzipコマンドを使います。
batch.zipファイルを解凍する例です。
unzip batch.zip
シェルで複数ディレクトリを削除する
シェルで複数ディレクトリを削除するには、rm -rコマンドを使います。
hulftとlogディレクトリを削除する例です。
rm -r hulft log
シェルでif -eでファイル存在チェックをする
シェルでif文でファイルが存在する場合、しない場合を判断したい場合、-eを使います。
if [-e $FILE]; then #存在する場合 else #存在しない場合 fi
シェルで複数ディレクトリを指定のディレクトリにコピーする
複数ディレクトリを指定のディレクトリにコピーするには、cp -rコマンドを使います。
hulft,logディレクトリをbkディレクトリにコピーする例です。
cp -r hulft log bk/.
シェルの引数にファイル名を指定して読み込む
sh a.sh a.txt
というようにしてa.txtファイルを読み込むには、while readを使用します。
シェルは以下のように書きます。a.txtは$1変数に入るのでそれを指定しても良いです。
#!/bin/bash while read hoge do # 処理 done < a.txt
hoge変数にファイルの各1行が入ります。
変数から部分文字列を取得する
変数の値の部分文字列を取得するには、${変数名:オフセット:長さ}とします。
変数Aの値が12345の場合で考えます。
変数 | 値 |
---|---|
${A:0:2} | 12 |
${A:2:2} | 34 |
${A:0:3} | 123 |
bashの機能なので、それ以外のシェルだとBad substitutionとエラーが出ます。
シェルでexpr lengthで文字列長を判断する
シェルでexpr lengthで文字列長を判断することができます。
expr length "test"
結果は文字列長である4を返します。
シェルの特殊変数$?、$#
シェルの$?は、直前に実行されたコマンドのステータスを返します。
コマンドが成功していたら、$?には0が入ります。
$#はシェルスクリプトの引数の数を保持しています。
引数が3つあれば、$#は3になります。
また、引数は1を基底として$1,$2,$3に入っています。
./a.sh aaa bbb ccc echo $# #3 echo $1 #aaa echo $2 #bbb echo $3 #ccc
シェルでif -nで文字列長チェックをする
シェルでif -nで文字列長チェックをする場合、しない場合を判断したい場合、-nを使います。
if [-n "$LINE"]; then #文字列長 ≠ 0の場合 else #文字列長 = 0の場合 fi
この時、変数$LINEはダブルクォーテーションで囲まなくてはいけません。
シェルでif -sでファイル容量0バイトチェックをする
シェルでif -sでファイル0バイトチェックをする場合、しない場合を判断したい場合、-sを使います。
if [!-s $FILE]; then #0バイトのファイルの場合 else #0バイトではないファイルの場合 fi
case文を使用する
変数Aが1,2,その他の場合のcase文例です。
case ${A} in 1) echo ${AAA} ;; 2) echo ${AAA} ;; *) echo "not case" esac
LANG=C date
現在日時を表示するにはdateコマンドで表示することが出来ます。
LNAG=C date
とすると税国表記になります。
Fri Jun 5 15:41:00 JST 2010
シェルだとhoge=$(LANG=C date)
というように書いたりするのをよく見ます。
スペース区切りの文字列をfor文でループする
“User Company Type”という文字列があった場合に、User,Company,Typeの順でループがしたいとします。
以下のように記述すると簡単にループすることが出来ます。
Arg="User Company Type" for i in $(echo ${Arg}) do echo $i done
引数の数だけループ処理を行う
引数の数だけループ処理を行うには、$@を使います。
a.sh
for i in $@ do echo $1 shift done
実行すると以下のように出力されます。
$sh a.sh a i u e o a i u e o
変数の%%
変数に%%と使うのをよく見ます。変数展開した値の末尾を削除してくれます。
変数 | 第一引数 | 戻り値 |
---|---|---|
${1%%.*} | hoge.com | hoge |
${1%% *} | hoge1 hoge2 | hoge1 |
シェルの配列
()で配列を宣言します。
ARR=(1 2 3)
各要素は半角スペースで区切ります。配列をループします。
for aaa in ${ARR[@]}; do echo $aaa done
シェルの連想配列
配列と似ていますが、declare -A 変数名
と宣言します。
日付でループ
日付でループしたい場合while-doでループできます。-gt
なので3回ループします。
#!/bin/bash START_DATE=20210101 END_DATE=20210103 CUR=$START_DATE while [ 1 ] ; do if [ $CUR -gt $END_DATE ] ; then break fi echo $CUR # ここで処理 CUR=`date -d "$CUR 1day" "+%Y%m%d"` done
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント