Bashテクニック集

Unixシェルかつコマンド言語Bashのテクニック集です。個人的によく使いそうなものだけをピックアップしています。

目次

条件文

if文

# 第一引数をstrに格納
str=$1

if [ $# -ne 1 ]; then
  echo "1st arg is empty!"
  exit
fi

if [[ $str == "aaa" ]]; then
  str="AAA"
elif [[ $str == "bbb" ]]; then
  str="BBB"
else
  str="CCC"
fi

繰り返し

forループ

for ((i = 0; i < 10; i++))
do
  echo $i
done

配列ループ

string="aaa,bbb,ccc"
IFS=', ' read -r -a array <<< "$string"

# loop:
for index in "${!array[@]}"
do
  echo "$index : ${array[index]}"
done

# Output:
#  0 : aaa
#  1 : bbb
#  2 : ccc

文字列操作

空白をTrim

string="   aaa   "
echo ${string//[[:blank:]]/} # "aaa"

文字列分割

str="aaa,   bbb,ccc "

arr=(${str//,/ })
# または:
# IFS=', ' read -r -a arr <<< "$str"

echo ${arr[0]} # "aaa"
echo ${arr[1]} # "bbb"
echo ${arr[2]} # "ccc"

入力受付

echo "何か入力してください:"
read hoge
echo "$hoge"

ファイル操作

ヒアドキュメント

# hoge.txt に直接書き込む
cat << EOS > hoge.txt
  aaa
  bbb
  ccc
EOS

# hoge.txt:
# 
#  aaa
#  bbb
#  ccc
# 

ファイル内の文字置換

echo "HOGE=abc" >> hoge.txt

# hoge.txtファイル内の 'HOGE=.*' な行を置換:
sed -ie "s/^HOGE=.*/HOGE=aaa/g" ./hoge.txt

# hoge.txt: HOGE=*** -> HOGE=aaa

# hoge.txtファイル内の 'HOGE=.*' な行をタイムスタンプで置換:
sed -ie "s/^HOGE=.*/HOGE=$(date +%s)/g" ./hoge.txt

# hoge.txt: HOGE=aaa -> HOGE=12345678

ファイルの先頭に文字列追加

$ echo "world" > hoge.txt

# ファイルの先頭に"hello"追加:
$ sed  -i '1i hello' ./hoge.txt 

$ cat hoge.txt 
hello
world

圧縮と解凍

zipコマンド版

# zip圧縮:
$ zip -r mydir.zip mydir/
# パスワード付きでzip圧縮:
$ zip -r -e mydir.zip mydir/
Enter password: ここでパスワードを入力
Verify password: ここでパスワードを再入力

# zip圧縮ファイルの中身を確認:
$ unzip -l mydir.zip

# zip圧縮ファイルを解凍:
$ unzip mydir.zip

tarコマンド版

# tarでgzip圧縮 (czオプション):
$ tar czfv mydir.tar.gz mydir/

# gzip圧縮ファイルの中身を確認 (tzオプション):
$ tar tzfv mydir.zip

# gzip圧縮ファイルを解凍 (xzオプション):
$ tar xzfv mydir.zip

NOTE: tarコマンドは複数のファイルを一つにまとめるコマンドです。gzipコマンドではフォルダを圧縮できないため、tarコマンドに cz オプションを付けることで、フォルダを一旦一つのファイルにまとめてからgzip圧縮を行っています。

スリープ

# 10秒スリープ
sleep 10s
# 1分スリープ
sleep 1m
# 1時間スリープ
sleep 1h
# 1日スリープ
sleep 1d

コマンド結果を変数に代入

# lsコマンド結果を変数hogeに代入
hoge=$(ls)
echo "${hoge}"

ランダム

# 1 - 10 の範囲でランダムな数を表示:
echo $(((RANDOM % 10) + 1))

プログレスバー

何らかの処理が進んでいることを示すために #################### (100%) ←こういうプログレスバーを表示します:

for ((i = 1; i <= 10; i++))
do
  bar=$bar'##'
  percent=$((i * 10))
  echo -ne "$bar ($percent%)\r"
  sleep 1
done

echo -ne '\n'
芽萌丸プログラミング部 @programming
プログラミング関連アカウント。Web標準技術を中心に書いていきます。フロントエンドからサーバサイドまで JavaScript だけで済ませたい人たちの集いです。