Skip to content

Instantly share code, notes, and snippets.

@LeeDDHH
Last active January 2, 2022 07:26
Show Gist options
  • Save LeeDDHH/dfc542c49001c36ee6f31d593d15018c to your computer and use it in GitHub Desktop.
Save LeeDDHH/dfc542c49001c36ee6f31d593d15018c to your computer and use it in GitHub Desktop.
shellの基本

変数、制御構文、コマンドの入出力操作

  • 変数
  • 制御構文
  • パイプ
  • リダイレクト

標準入出力・標準エラー出力

  • 多くのコマンドで区別していること
    • そのコマンドが別コマンドに渡すべきデータ
      • 結果値のようなもの
      • 標準出力
    • そうではないデータ
      • コマンドの説明文のようなもの
      • 標準エラー出力
    • パイプやリダイレクトで一方がファイルや別コマンドに向けられると、一方しか画面に出てこなくなる
  • コマンドがデータを読む口
    • 標準入力
    • デフォルトでは端末につながっている
  • ファイル記述子
    • file descriptor(ファイルディスクリプタ)
      • コマンドの入出力先がどこかを管理するための番号
    • 記述子 説明
      0< 標準入力
      1> 標準出力
      2> 標準エラー出力

シェルと変数

  • 変数名=値となる文字列
    • 使う場合
      • $変数名
      • ${変数名}
  • 変数定義時に「=」の前後に空白を入れてはいけない
    • 変数名=値となる文字列変数名 がコマンドで =値となる文字列 が引数と解釈する

文字列の連結と置換

  • man bashParameter 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} のように空白が入った引数を、ひとつにまとめて引き渡す
      • {print1+1} に分けて渡さない
    • $1 などのawkの変数が、シェルの変数として解釈されることを防止
  • 特殊なケースを除いて、bashは '' でクォートされた文字列に何も手を加えない
    • 単に文字列として解釈する
    • grepsed の引数も、同様の理由から '' で囲む
  • ""
    • 引数にbashの変数を使いたいとき
    • "" の中にあるbashの変数は解釈される
    • bash内の特殊記号も解釈される
  • ${変数名}{}
    • "" で囲っても変数として使える
  • 空の文字列を引数として使う場合
    • re=""; grep "$re" /etc/passwd
      • grep "" /etc/passwd が実行される
      • 検索語が空文字になる
    • re=""; grep $re /etc/passwd
      • grep /etc/passwd が実行される
      • grep の検索語が /etc/passwd になり、検索対象の入力を待つ状態になる
    • シェルスクリプトを書くとき、空文字対策として、変数はなるべくダブルクォートで囲っておく

Bashの配列と連想配列

  • 標準入力でデータを扱うので、配列と連想配列を使用する場面はあまりない
  • 配列名=()
    • 配列の初期化
    • () 内に文字列を並べる
      • a=("$SHELL" "$LANG" "$USER") のような書き方
    • インデックスは 0 から始まる
  • declare -A 連想配列名
    • 連想配列の初期化
    • キーバリューの指定
      • b["foo"]="bar" のような書き方
  • ${配列もしくは連想配列[@]}${配列もしくは連想配列[*]}
    • 要素をすべて出力する
  • ${#配列もしくは連想配列[@]}
    • 要素の総数
    • ${#変数名} は文字列の長さを表す
  • ${!連想配列[@]}
    • 連想配列のキーを出力
  • [@][*] の違い
    • "" で囲むと結果が変わる
      • bashの IFS(Internal Field Separator、内部フィールド区切り文字) を出力結果の間に表示する/しない

参考


zshの配列と連想配列

配列

  • 明示的な配列の宣言
    • ローカル変数として宣言
      • 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行ずつ文字列を読み込んで、変数にセットする

終了ステータスとPIPESTATUS

  • コマンドの成否を把握する
    • 終了ステータス
      • コマンド自身がどのように終了したか
      • $?
        • 成功 0
        • 失敗 1
        • 2 以降のケースもある
        • コマンドを間違える 127
  • シェルは次のコマンドが実行されるまで、終了ステータスを記憶する
  • man bashEXIT STATUS で詳細説明が見れる
    • 128 以上の終了ステータスは、異常終了の原因となったシグナルを特定する事ができる
  • PIPESTATUS
    • パイプでコマンドが複数つながっている場合に使う
    • bash
      • ${PIPESTATUS[@]}
    • zsh
      • ${pipestatus[@]}

位置パラメータ

  • 主にシェルスクリプトで引数を受け取るときに使う
  • 位置パラメータをまとめて扱う
    • $@

参考

プロセスを意識してshellを操作

ブレース展開とファイルグログ

シグナルをあやつる

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment