アレについて記す

Bash書くための雑なメモ

Posted on October 10, 2015 at 19:02 (JST)

半年ぶりのエントリーはただの忘備録です。

お約束

shebang

#!/bin/bash

変数の宣言・代入

変数のルール

  • 英数字とアンスコで構成される
  • 数字では始められない
  • 大文字/小文字は区別される

VAR=hogehoge
※ = の両端にスペースを入れてはならない!

リスト
半角スペースかtabで区切った文字列は使う場所により配列扱いになる。

ヒアドキュメント

cat <<- EOF
Options:
  -?,-h         : this help
  -v            : show version and exit
EOF

制御文

if文

if condition_1
then
  commands_1
elif condition_2
then
  commands_2
else
  command_3
fi

conditionは test コマンドを用いるか、[]を用いる。

if test $1 -le 0
if [ $1 -le 0 ]

コマンドの実行結果(正常:0, 異常:0以外)で分岐する

if diff $$2 > /dev/null  #出力結果は不要
then
  echo 'has no diff'
else
  echo 'has diff'
fi

Tips: commandの後に $? を実行すると終了コードが確認できる

for文

VAR_LIST="item1 item2 item3" #スペースかタブ区切りでワードリストと判定される
 
for VAR in $VAR_LIST
do
  echo $VAR
done

while文

while condition
do
  command
done

case文

case $1 in
  hoge | foo ) echo 'hoge or foo' ;;
  [!A-Z]) echo 'not A-Z' ;;
  ???) echo '3文字の文字列' ;;
  "?") echo '末尾が?' ;;
  ) echo 'other' ;;
esac

select文

#!/bin/bash
 
select i in ll pwd date
do
  case $i in
    ll) ls -l ;;
    pwd) pwd ;;
    date) echo date ;;
    ) echo "No such number <$REPLY>." ;;
  esacss
done

testコマンド

expr Javaっぽくいうと
num1 -lt num2 num1 < num2
num1 -le num2 num1 <= num2
num1 -gt num2 num1 > num2
num1 -ge num2 num1 >= num2
num1 -eq num2 num1 == num2
num1 -ne num2 num1 != num2
str1 = str2 str1.equals(str2)
str1 != str2 ! str1.equals(str2)
str1 ! isEmpty(str1)
-n str1 ! isEmpty(str1)
-z str1 isEmpty(str1)
expr1 -a expr2 expr1 && expr2
expr1 -o expr2 expr1 || expr2
!expr1 ! (expr1)
(expr1 -o expr2) -a expr3 (expr1 || expr2) && expr3

その他

prinfコマンドで整形

printf "%5d: %s\n" 123 hogehoge

変数の展開

# 変数に値が入っていない場合に値を返す(代入はしない)
${var:-word}
 
# 変数に値が入っていない場合に値を代入する
${var:=word}
 
# 変数に値が入っていない場合にメッセージを出力し終了する
${var:?word}
 
# 変数に値が入っている場合に値を返す(代入はしない)
${var:+word}
 
# substring: length指定しない場合は末尾まで
${var:offset}
${var:offset:length}
 
# prefixで始まる変数名をすべて表示する
${!prefix}
 
# 変数に代入されている値の文字数を表示
${#var}
 
# 代入されている値の文字列から前方一致した部分を削除する
${var#expression} # 最短一致
${var##expression} # 最長一致
 
# 代入されている値の文字列から後方一致した部分を削除する
${var%expression} # 最短一致
${var%%expression} # 最長一致
 
# 代入されている値の文字列を置き換える
${var/pattern/str} # 最初に一致したもののみ
${var//pattern/str} # 一致したもの全て

位置パラメータ

$ ./sample.sh "hello world" "I love coffee"
 
[$*][$@]は同じ挙動 → 位置パラメータは5つ(単語)
["$"]は全文が1つの位置パラメータと解釈される
  => <hello world I love coffee>
 
["$@"]はダブルクォートで囲まれた単位で位置パラメータに設定される
  => <hello world> <I love coffee>

以上です。