POSIXシェル
POSIXシェルの仕様などについて書く。
About
sh, bash, ksh, ash, dashなど。
POSIX準拠だったり、互換だったりするシェル。
Documentation
- POSIX 1003.1 - man page for sh (posix section 1p) - Unix & Linux Commands
- CONTENTS - Shell & Utilities: Detailed TOC | The Open Group
- Shell Command Language (www.unix.org))
- System V や POSIX の古典的な仕様がまとまってるっぽい雰囲気
スクリプティング
POSIX互換/準拠にこだわる人たち(原理主義者)がコツをまとめてくれてたりする。
参考:
- どの環境でも使えるシェルスクリプトを書くためのメモ ver4.60 - Qiita
- スクリプト言語としてみた各POSIXシェルの特徴と互換性上の注意点まとめ - Qiita
- すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集] | 松浦 智之, USP研究所 |本 | 通販 | Amazon
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
- https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_16
- Bash: https://tiswww.case.edu/php/chet/bash/bashref.html#Bourne-Shell-Builtins
何もしないコマンド
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
参考:
- シェルスクリプト return コマンド - Qiita
- https://github.com/progrhyme/experiments/tree/master/bash/source-scripts
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で終了する。
もっぱら論理式的に使われる。