ファイルディスクリプタ
プログラムからファイルを操作する際、操作対象のファイルを識別・同定するために割り当てられる整数値。
- 標準入力:0
- 標準出力:1
- 標準エラー:2
Windowsの世界では、ファイルハンドルとも呼ばれる。
Linuxの場合、ファイルディスクリプタの上限確認は、ulimit
コマンドを使用する。
$ ulimit -n
1024
パイプ
複数のコマンドをつなぎ、標準出力を次のコマンドに渡す。
xargsコマンドと併用することで、直前のコマンドの標準出力を後のコマンドの引数にして実行できる。
$ seq 8 | xargs echo
1 2 3 4 5 6 7 8
teeコマンドと併用することで、標準入力と標準出力をファイルに書き出すことができる。
$ echo "Hello world" | tee Hello.txt
Hello world
$ cat Hello.txt
Hello world
${PIPESTATUS[@]}
でパイプの先頭、 もしくは途中にあるコマンドの終了ステータスを参照することができる。
$?
はパイプの最後の終了ステータスしかわからない。
$ true | true | false
$ echo $?
1
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
0 0 1
リダイレクト
コマンドの実行結果をファイルに保存する。
リダイレクトの種類
コマンド | 説明 |
---|---|
コマンド>ファイル | コマンド結果をファイルへ書き込む |
コマンド<ファイル | ファイルの内容をコマンドの標準入力へ |
コマンド>>ファイル | コマンドの結果をファイルへ追記 |
コマンド2>ファイル | コマンドのエラー出力をファイルに書き込む |
コマンド2>>ファイル | コマンドのエラー出力をファイルに追記 |
コマンド>ファイル2>&1 | コマンドの結果とエラー出力をファイルに書き込む |
コマンド>>ファイル2>&1 | コマンドの結果とエラー出力をファイルに追記 |
コマンド>/dev/null 2>$1 | 表示をしない |
- /dev/nullは、リダイレクト時に出力せず、破棄するときに指定するパス。
変数
- 参照時には
$
をつける。 - =で代入する。前後に空白を入れることはできない。
- 代入時に
$
をつけない。 - ""(ダブルクォーテーションマーク)で囲むと文字列が展開される。
- ''(シングルクォーテーションマーク)で囲むと文字列は展開されない。
- ``(バッククオート)で囲むとコマンドの標準出力が変数に設定される。$(command)でもできる。
$ echo $hello
# 代入
$ hello=hello
# 参照
$ echo $hello
hello
# 解放
$ unset hello
$ echo $hello
# 読み取り専用
$ readonly var=foo
$ echo $var
huga
$ var=fuga
-bash: var: 読み取り専用の変数です
$ unset var
-bash: unset: var: 消去できません: variable は読み取り専用です
# コマンドの実行結果を変数に代入
# $(command)でも代替可能
$ cmd=`pwd`
$ echo $cmd
/root
位置パラメータ
- スクリプト実行時に引数として渡された内容は、位置パラメータという変数に保持され、スクリプトの中では、
$1
~$9
で表される。 -
$0
は実行中のスクリプト名を表示する。 -
$#
は位置パラメータの数を表示する。(0を除く) - 位置パラメータを集合的に扱う場合は、
$*
,$@
がある。 - bashの変数は、グローバルスコープである為、関数内で変数をローカルに扱いたい場合は、
local
を使用する。
# !/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $#
echo $*
echo $@
上記を実行する
$ bash sample.sh p1 p2 p3
sample.sh
p1
p2
p3
3
p1 p2 p3
p1 p2 p3
終了ステータス
- コマンドの実行結果の成否は特殊偏す
$?
に代入される。 - 慣例的に終了ステータス0の場合は正常終了を表し、それ以外はエラーもしくはエラーに準ずる状態である。
-
rm -f
の終了ステータスは、常に0になるので注意。