Bash

Bashでシェルスクリプトを書くための備忘録

Bourneシェル、実際にはBashでシェルスクリプトを書くための備忘録

Bashのバージョンを確認する。

Bash
$ echo $BASH_VERSION
3.2.57(1)-release

カレントディレクトリのフルパスを取得する。

Bash
$ echo $PWD

部分文字列を取り出す。

Bash
$ letters='abcdefghijklmnopqrstuvwzyz'
$ echo ${letters:0:4}    # 0から数えて0番目から4文字を取り出す
abcd
$ echo ${letters:7:16}    # 0から数えて7番目から16文字を取り出す
hijklmnopqrstuvw
$ echo ${letters:9}    # 0から数えて9番目から最後までを取り出す
jklmnopqrstuvwzyz

文字列が空か1文字以上あるかをテストする。

Bash
#!/bin/sh
arg1=$1    # 第1コマンド引数からテストしたい文字列を取得
if [ -n "$arg1" ]; then    # ダブルクオートで囲うことが重要; 1文字以上の長さがあったら
  echo 'more than 0 characters (-n)'
else
  echo '0 character (-n)'
fi
if [ -z $arg1 ]; then    # ダブルクオートで囲まなくてもいい; 文字列長が0であったら
  echo '0 character (-z)'
else
  echo 'more than 0 characters (-z)'
fi
exit

ファイル名からパスや拡張子を取り除いた文字列を取得する。

Bash
$ basename /etc/ssh/ssh_host_rsa_key.pub
ssh_host_rsa_key.pub
$ basename /etc/ssh/ssh_host_rsa_key.pub .pub
ssh_host_rsa_key

forループのために便利なコマンドseqの使い方。

Bash
$ seq 52 7    # 1ずつ減らしながら52以下7以上の全ての整数を表示
$ seq -f "%03g" 3 372    # 数字の前に0を加えて桁を揃えて表示

正規表現を使ってみる。

Bash
$ cat test.sh    # 名前の末尾が _c, _d, _e, _f のいずれかであるディレクトリを判定
#!/bin/sh
mkdir test_{a,b,c,d,e,f,g,h}
for dir in test_*
do
  cd $dir/
  if [[ $PWD =~ ^.+_[c-f]$ ]]; then
    pwd    # .+ のところを [¥/¥w]+ と書いたら意図した通りに動作しなかったので要注意
  else
    date
  fi
  cd ../
done
rm -fr test_?/
exit
$ ./test.sh 
Fri Jul 21 15:43:54 JST 2017
Fri Jul 21 15:43:54 JST 2017
/tmp/test_c
/tmp/test_d
/tmp/test_e
/tmp/test_f
Fri Jul 21 15:43:54 JST 2017
Fri Jul 21 15:43:54 JST 2017

タブや改行を出力する。

Bash
$ echo -e "foo\tbar\nbaz\tqux"

最終コマンド引数を取得する。

Bash
echo ${@:$#}

キーボードからの入力を促がす。

Bash
read -p 'Type any string. ' str
echo $str

配列を使ってみる。

Bash
declare -a names=("Alice" "Bob" "Carol" "David")
declare -a years=(1985 1989 1995 1996)
for i in {0..3}
do
  echo -e "$i\t${names[$i]}\t${years[$i]}"
done

直前のコマンドのプロセスIDを取得する。

Bash
ls -l
previous_pid=$!

ファイルサイズが0か否かを確認する。

Bash
if [ -s $1 ]; then    # 変数が定義されているか否かも -s で確認可能
  :
else
  rm $1
fi

その他のファイルテスト演算子: -e 存在するか; -d ディレクトリか; -f 通常のファイルか

ファイルが同一か否かを確認する。

Bash
cmp foo bar
if [ $? -eq 0 ]; then
  echo identical
else
  echo different
fi

否定、論理和、論理積の書き方。

Bash
if [ \( ! -e foo \) -a \( -e bar \) ]; then
  echo 1
elif [ \( ! -e foo \) -o \( -e bar \) ]; then
  echo 2
else
  echo 3
fi