POSIXシェル

POSIXシェルの仕様などについて書く。

About

sh, bash, ksh, ash, dashなど。

POSIX準拠だったり、互換だったりするシェル。

Documentation

スクリプティング

POSIX互換/準拠にこだわる人たち(原理主義者)がコツをまとめてくれてたりする。

参考:

Spec

※調査が甘くてPOSIXの仕様じゃないものが混ざっているかもしれない。

パラメータと変数

Parameter Expansion

Shell Command Language#2.6.2 Parameter Expansion

${expression} こういうやつ。最もシンプルなのは ${parameter} とそのままブレースで囲むだけ。

種類:

  • ${#parameter} … 文字列の長さを表す

参考:

演算子

NOTE:

  • [ 条件式 ]test 条件式 と同じ。

See test

参考:

単項条件演算子

演算子真の条件
-v VAR変数VARが定義されている。※ -v $VAR ではない
-n $str$str に長さ1以上の文字列が入っている
-z $str$str が空文字
-x $path$path が実行可能ファイル
-L $path$path がシンボリックリンク
-S $path$path がソケット

参考:

二項条件演算子

構文真の条件
“$str1” = “$str2”$str1と$str2が等しい
“$str1” != “$str2”$str1と$str2が等しくない
$x -eq $y数値$xと$yが等しい
$x -ne $y数値$xと$yが等しくない
$x -gt $y数値$xが$yより大きい
$x -lt $y数値$xが$yより小さい
$x -ge $y数値$xが$y以上
$x -le $y数値$xが$y以下
$path1 -nt $path2$path1 のタイムスタンプが $path2 より新しい
$path1 -ot $path2$path1 のタイムスタンプが $path2 より古い

ループ

## 無限ループ
while true; do
  if true; then
    continue # 後続の処理をスキップして次の周回へ
  else
    :
  fi
  :
done

## イテレータでループ
for i in $(get_some_list); do
  :
done

参考:

関数

Shell Command Language#2.9.5 Function Definition Command

Syntax:

fname() compound-command [io-redirect ...]

NOTE:

  • function キーワードはBash等による拡張のようだ

case構文

Shell Command Language#Case Conditional Construct

構文:

case 値 in
  パターン1 ) 処理1 ;;
  パターン2 ) 処理2 ;;
  パターン3 ) 処理3 ;;
  パターンn ) 処理n ;;
esac

NOTE:

参考:

パターンマッチ

Shell Command Language#2.13. Pattern Matching Notation

パターンマッチ文字列
?任意のアスキー1字
*ヌル文字を含む任意の文字列
[[...][] 内の任意の1字にマッチする

Parameter Expansion

Examples:

parameter=${parameter:-word}
if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

参考:

Built-Ins

. (dot)

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_18

: (colon)

null utility

何もしないコマンド

return

関数かdot scriptを終了する

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_24

Examples:

return 0
# 0以外だと異常終了扱い
return 1

# 引数省略時は最後のコマンドのexit statusになる
return

参考:

unset

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_29

Examples:

# シェル変数または環境変数を削除
unset [-v] FOO
# 関数名を削除
unset -f my_func

参考:

Utilities

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap04.html#tag_20

必須のものと、オプショナルなものがある。
何が必須で、何がそうでないかについては、1.7.1 Codesにコードが定義されている。

test

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128

# 1
test [expression]

# 2
[ [expression] ]

expressionを評価して、成功なら0, 失敗なら非0で終了する。
もっぱら論理式的に使われる。