-
-
Save LeeDDHH/dfc542c49001c36ee6f31d593d15018c to your computer and use it in GitHub Desktop.
shellの基本
- 変数
- 制御構文
- パイプ
- リダイレクト
- 多くのコマンドで区別していること
- そのコマンドが別コマンドに渡すべきデータ
- 結果値のようなもの
- 標準出力
- そうではないデータ
- コマンドの説明文のようなもの
- 標準エラー出力
- パイプやリダイレクトで一方がファイルや別コマンドに向けられると、一方しか画面に出てこなくなる
- そのコマンドが別コマンドに渡すべきデータ
- コマンドがデータを読む口
- 標準入力
- デフォルトでは端末につながっている
- ファイル記述子
- file descriptor(ファイルディスクリプタ)
- コマンドの入出力先がどこかを管理するための番号
-
記述子 説明 0< 標準入力 1> 標準出力 2> 標準エラー出力
- file descriptor(ファイルディスクリプタ)
変数名=値となる文字列
- 使う場合
$変数名
${変数名}
- 使う場合
- 変数定義時に「=」の前後に空白を入れてはいけない
変数名=値となる文字列
は変数名
がコマンドで=
と値となる文字列
が引数と解釈する
man bash
のParameter Expansion
に文字列操作の項目がある
- 変数を並べる
- 単に文字列に置き換わるだけ
# 単につなげる
$ a=bar
$ b=foo
$ c=$a$b; echo $c;
barfoo
# 文字列追加
$ a=bar
$ b=foo
$ a+=$b; echo $a;
barfoo
${変数名:開始文字位置:長さ}
${a:0:1}
の場合- aの0文字目から1文字
$ a=bar
$ b=${a:0:1}${a:2:1}; echo $b;
br
${変数名/置換対象文字列/置換後の文字列}
${a/b/d}
の場合- aの文字列の中からbをdに変える
$ a=bar
$ b=${a/b/d}; echo $b;
dar
$((変数))
- 文字列を一時的に数字として扱う
- 算術式展開、算術式評価、ARITHMETIC EVALUATION
<<
- ビットシフト演算子
- 冪乗
$[]
- コードゴルフ
- 極限までコードを短く書く必要がある場合に利用する
$((a+b))
と$[a+b]
は同じ結果
- クォートの役割
{print 1+1}
のように空白が入った引数を、ひとつにまとめて引き渡す{print
と1+1}
に分けて渡さない
$1
などのawkの変数が、シェルの変数として解釈されることを防止
- 特殊なケースを除いて、bashは
''
でクォートされた文字列に何も手を加えない- 単に文字列として解釈する
grep
、sed
の引数も、同様の理由から''
で囲む
""
- 引数にbashの変数を使いたいとき
""
の中にあるbashの変数は解釈される- bash内の特殊記号も解釈される
${変数名}
、{}
""
で囲っても変数として使える
- 空の文字列を引数として使う場合
re=""; grep "$re" /etc/passwd
grep "" /etc/passwd
が実行される- 検索語が空文字になる
re=""; grep $re /etc/passwd
grep /etc/passwd
が実行されるgrep
の検索語が/etc/passwd
になり、検索対象の入力を待つ状態になる
- シェルスクリプトを書くとき、空文字対策として、変数はなるべくダブルクォートで囲っておく
- 標準入力でデータを扱うので、配列と連想配列を使用する場面はあまりない
配列名=()
- 配列の初期化
()
内に文字列を並べるa=("$SHELL" "$LANG" "$USER")
のような書き方
- インデックスは
0
から始まる
declare -A 連想配列名
- 連想配列の初期化
- キーバリューの指定
b["foo"]="bar"
のような書き方
${配列もしくは連想配列[@]}
、${配列もしくは連想配列[*]}
- 要素をすべて出力する
${#配列もしくは連想配列[@]}
- 要素の総数
${#変数名}
は文字列の長さを表す
${!連想配列[@]}
- 連想配列のキーを出力
[@]
と[*]
の違い""
で囲むと結果が変わる- bashの
IFS(Internal Field Separator、内部フィールド区切り文字)
を出力結果の間に表示する/しない
- bashの
- 明示的な配列の宣言
- ローカル変数として宣言
local -a 配列名
typeset -a 配列名
- グローバル変数として宣言
typeset -g -a 配列名
- ローカル変数として宣言
- 代入
配列名=()
で空の配列配列名=(値 値)
で値を入れて代入
- 要素の参照
- インデックスが
1
からはじまる$配列名[1]
- マイナスのインデックスで配列の後ろから指定できる
$配列名[-1]
- 指定したインデックスの間の値を取得する
$配列名[1,3]
- インデックスが
- 変更
- 先頭の要素を削除
shift 配列名
- 先頭に要素を追加
配列名=(foo $配列名)
- 末尾に要素を追加
配列名=($配列名 foo)
- 末尾の要素を削除
配列名=($配列名[1,-2])
- 先頭の要素を削除
- 要素をすべて出力する
${配列名[@]}
、${配列名[*]}
- 要素の総数
${#配列名[@]}
- 明示的な配列の宣言
- ローカル変数として宣言
local -A 連想配列名
typeset -A 連想配列名
- グローバル変数として宣言
typeset -g -A 連想配列名
- ローカル変数として宣言
- 代入
連想配列名=(["キー名"]=値 ["キー名"]=値 …)
連想配列名=(キー名 値 キー名 値 …)
キー
値
の順位スペース区切りで並べる
- 要素の参照
$連想配列名[キー名]
$連想配列名[@]
、$連想配列名[*]
、$連想配列
- 要素の値全体
${(k)連想配列名}
- すべてのキー
${(kv)連想配列名}
- すべてのキー、値
${#連想配列名}
- 要素の総数
- 変更/追加
- キー指定で変更
連想配列名[キー名]=新しい値
- 既存の連想配列にキーが存在しない場合、新しく追加する
- キー指定で変更
- 削除
unset "連想配列名[キー名]"
set 値 値 値 …
- 位置パラメータとして使える
$数字
、${数字}
で呼び出せる- 2桁以上は必ず
${数字}
で呼び出す
- 繰り返しと終了
for 識別子 in 値; do 処理; done
- 変数、文字列を次々に処理するときに使う
while read 識別子; do 処理; done
- 標準入力から1行ずつ文字列を読み込んで、変数にセットする
- コマンドの成否を把握する
- 終了ステータス
- コマンド自身がどのように終了したか
$?
- 成功
0
- 失敗
1
2
以降のケースもある- コマンドを間違える
127
- 成功
- 終了ステータス
- シェルは次のコマンドが実行されるまで、終了ステータスを記憶する
man bash
のEXIT STATUS
で詳細説明が見れる128
以上の終了ステータスは、異常終了の原因となったシグナルを特定する事ができる
PIPESTATUS
- パイプでコマンドが複数つながっている場合に使う
- bash
${PIPESTATUS[@]}
- zsh
${pipestatus[@]}
- 主にシェルスクリプトで引数を受け取るときに使う
- 位置パラメータをまとめて扱う
$@
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment