シェルチートシート

シェルチートシート

シェルの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

コメント

タイトルとURLをコピーしました