シエルの基本機能

  • 変数
    • 変数は変数名=値
    • その変数は「$変数名」で利用
  • リダイレクション
t t t t
>&m 標準出力をファイルディスクリプタm版に向ける 2>file 標準エラー出力の内容をfileに書き込む
>&- 標準出力を閉じる 2>>file 標準エラー出力の内容をfileに追加
n>file ファイルディスクリプタn版の指す対象への出力をfileに書き込む 2>&1 標準エラー出力を標準出力へ
n>&m ファイルディスクリプタn版の指す出力先をファイルディスクリプタm版のサス対象へ向ける 1<&2 標準出力を標準エラー出力へ
n<file fileの内容をファイルディスクリプタn版の指す対象の入力とする n<&m ファイルディスクリプタがm版の指す入力元をファイルでぃクリプタn版の指す対象へ向ける
  • 標準出力&エラー出力を同じログへ -> $ command > log 2>&1
    • * ... 0~の任意
    • ? ... 1個の任意
bash 意味 sh
[^0-9] 数字以外 [!0-9]
  • ヒアドキュメント
<< 大文字 内容 大文字 < < <
内容を標準入力へ 内容を標準入力へ。内容の各行のタブ無視 内容を標準入力へ。内容の内部変数は未展開 内容を標準入力へ。左に同じ
  • パイプ...左側のコマンドの標準出力を受け取ってそのまま右のコマンドの標準入力へ渡す
  • $ コマンド & ... バックで動かす。jobsコマンド(-l)で確認
  • () / {} ... サブシェルで/カレントシェルでグルーピング(同時処理)
  • コマンドヒストリの参照:$history, $!! ... 直前, $!数...数前のコマンド
  • 位置パラメータ
t t t t
$o シェルスクリプトの名前 $*, $@ スクリプトに指定された引数全て
$n スクリプトに指定された第n引数の値 "$*" スクリプトに指定された引数全てを一つとして扱う
$# スクリプトに指定された引数の数 "$@" スクリプトに指定された引数全てをそれぞれ個別に扱う

制御文とtestコマンド

if 条件 then 真の処理 elif 条件 then 2真の処理 else 偽の処理 fi for 変数 in リスト do 処理 done for ( ; ; ;) do 処理 done while 条件 do 処理 done
case 要素 in パターン1 ) 処理;; パターン2 ) 処理;; *) 処理 ;; esac select 変数 in メニューリスト do commands done until 条件 do 処理 done
# シェルの組み込みコマンド
  • コマンド ... カレントシェルでのシェルスクリプトの展開/実行。環境変数やシェル関数の設定を書き込んだスクリプトファイルをカレントシェルに読み込ませ、カレントシェルの環境変数や関数として利用できるようにします。
  • ($ : 明示的に何もしない)
declare 明示的な変数、関数の宣言 typeset 型セット
eval 引数をシェルコマンドとして実行。複数の時よく利用。''を使うと少し変化 getopts オプション処理 (例) while getopts optstring OPTION do case $option in optflag 1) 処理;; optflag 2) 処理;; \? ) 処理 ;; exac done shift `expr $OPTIOND -l`
exec カレントシェルの置き換え export シェル変数のエクスポート
wait 環境変数となる hash コマンドのハッシュテーブルの操作
kill プロセスへのシグナルの送出 let 変数の算術式による数値計算
local ローカルの変数の生成 printf 文字列の整形
pwd ワーキングディレクトリの表示 read キーボードからの入力を変数に代入
readonly 変数の読み出し専用化 set/unset 位置パラメータのセット、変数の値の一覧表示
shift 位置パラメータの順に移動 trap シグナルを受けたときの処理
type 組み込みか外部コマンドかチェック umask ファイル作成時のファイルモードのデフォルト決定
# 変数と関数
  • ${変数名 ; - 要素} ... 変数が定義されていれば中身を、何もなければ'要素'を返す
  • ${変数名 ; ? 要素} ... 何もなければ'要素'を出力。変数あ定義されていれば'要素'を代入
  • ${変数名 ; =要素} ... 何もなければ'要素'を代入する
  • ${変数名 ; + 要素} ... 何もなけば何もしない
  • bashで追加された拡張変数展開
t t t t
${変数:オフセット:長さ} 変数のオフセットから長さ分を取り出す $? 直前のコマンドの終了コード
${!変数名*} '変数名'で始まる全ての変数名を拾う $$ カレントシェルのプロセスID
${#変数} 変数の値の文字数を出力 $! 直前のバックグラウンドジョブのプロセスID
${変数#文字列} 変数の値の先頭から、文字列までを削除 $- カレントシェルの動作オプション
${変数%文字列} 変数の値の末尾から、文字列までを削除 $*/$@ 位置パラメータ全て
${変数/パターン/文字列} 変数のパターンに合致する部分を文字列を置き換え "$*" 位置パラメータを展開しスペースでつなぐ
| "$@" 位置パラメータを個別に展開
  • 組み込み変数
  • t t t t
    HOME ユーザのホームディレクトリ MAIL メール受信ファイル、そのファイルにメール追加されると通知
    PATH コマンドを検索するサーチパス MAILCHECK
    COPATH cdコマンドのサーチパス MAILPATH 複数のときのMAIL
    IFS デフォルトフィールドセパレータ OPTARG getoptsか利用する変数、オプションに該当する引数の値が代入される
    LANG デフォルトランゲージ OPTIND getoptsか利用する変数、次に処理するオプションの場所を位置パラメータの番号で確保
    LC_ALL LC*, LANGの値の全て PS1 シェルのコマンドプロンプト($)
    LC_TYPE 文字分数やマルチバイトの大きさ PS2 シェルの2次コマンドプロンプト(>)
    SHACCT 設定したファイルにアカウント情報を書き込む TERM 画面を出力する際の端末の種類
    SHELL シェルプログラムの実態を絶対パスで表す TZ タイムゾーン
    PPID 親プロセスのプロセスID HISTSIZE コマンドヒストリを残す個数
    PWD |HISTFILE コマンドヒストリを保存しておくファイル名
    OLDPWD 一つ前のカレントワーキングディレクトリ HISTFILESIZE ヒストファイルに残す最大数
    REPLY readコマンドで引数を指定しなかった時、この変数に読み込みの行の値が代入 HOSTNAME ホスト名
    UID ユーザのユーザID PS3 シェルの3次コマンドプロンプト(#$)
    GROUPS グループのグループID PS4 シェルの4次コマンドプロンプト(+)
    BASH シェルプログラムの実態を絶対パスで表示 IGNOREEOF 何個連続して'Ctrl + d'を入力すればログインシェルを落とすかを決める
    RANDOM 任意の数を返す TMOUT ログイン後設定された秒数、入力がなかったらログインシェルを自動終了
    LINENO ログインし絵tから実行したコマンドの個数 FIGNORE このリスト鬼あるサフィックスを持つファイルは、ファイル保管の対象外にする
    HISTCMD 次に実行するコマンドに割当られるヒストリ番号 HOSTFILE ファイル'/etc/hosts'の代替として利用するファイル名

    シェルスクリプトのデバッグ

    • sh -x ... 実行するコマンドの内容を表示する
    • sh -v ... 実行はせず、構文チェックだけを行う
    • sh -b ... 次に実行するコマンド行を表示する
    • sh -i ... 対話的モードを処理する
    参照:

    UNIXシェルスクリプトコマンドブック 第3版
    https://www.amazon.co.jp/UNIX%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC3%E7%89%88-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%96%E3%83%83%E3%82%AF%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B1%B1%E4%B8%8B-%E5%93%B2%E5%85%B8/dp/4797383577