Operating System
終了ステータスは、if, while, &&
,
||
などの 制御構造で、 論理値(true:真:成功<->
false:偽:失敗)に変わるもの として使われる(右図)が、
その解釈は、C言語に慣れた人には逆の解釈になっていることに 注意されたい。
これまでに紹介した(今日も扱う)パイプ |
によるコマンド同士の接続
(前段の標準出力を後段の標準入力に送るという接続)ではなく、
それぞれ独立に2つのコマンドを順次動作させるときの書き方として、
右図のような3つのつなぎ方がある。
;
で接続するのは、改行を挟んで2行に分けて書くのと同等で、
上から下(左から右)に順次実行。&&
、||
の論理記号で接続した場合、左のコマンドの終了ステータス次第で
右のコマンドを実行するかどうかが決まる。&&
と ||
の2つの記号は(C,
Java
およびそれを継承する多くのプログラミング言語でも同様に)単なる条件式の論理演算ではなく、
前から順にコマンド(プログラミング言語では「式」)を実行/評価していき、
&&
や ||
を含むコマンド列全体の論理値が確定すればその先の実行を省略・回避する、という制御構造として使われる(下図)。
ワイルドカードとして *
、 ?
の文字が使われることは すでに説明した。
*
は、任意の文字の並びとマッチ。?
は、任意の一文字とマッチする。このルールは、Unixのシェル(でのファイル名とのマッチ)に限らず 多くの場面で使われる。
Bashではこれを、ファイル名展開(パス名展開)における 「特殊パターン文字」と呼んでいて
「拡張パターンマッチング演算子」と合わせて、 より高度なマッチングに使われる。
いっぽう、正規表現は、プログラミング言語等で広く用いられる概念で、 ファイル名に限らず幅広く文字列とのマッチングを行うもの。
(もし「コマンド置換」がなかったとしたら)少し高度な話ですが補足しておきます。
ファイル経由だと使えるが、
echo 1 > xx
read a < xx
# のあと、
echo $a
# => 1 これは想定通り
パイプでreadに受け渡しができない。(制限つきで可能)
echo 2 | read a
# のあと、
echo $a
# => 2を出力しない```
echo 2 | (read a ; echo $a)
# => 2 括弧で囲むとその部分がサブシェルで実行される
=>解説ページ
指定したディレクトリにある、ディレクトリだけを選んで表示する。
ls -F
を使う
ls -F | grep /
末尾に(ディレクトリのときだけ)表示されるスラッシュが邪魔だと感じたら、
ls -F | grep / | sed 's/\/$//'
ls -l
を使う
ls -l | grep ^d
名前だけ表示したければ、
ls -l | grep ^d | awk '{print $9}'