bashのマニュアル、ざっとでいいので一読しておきましょう。
端末(シェル)で man bash で表示されます。
日本語で出ない人は過去のレジュメ等を参照して manpages-ja パッケージを入れて下さい)
Webでも見られる情報源もあります(例えばここ)
特に、複合コマンドの章が山場です。
終了ステータス(前に扱った)
コマンド置換(前に扱った)
変数置換などとともに、いくつかある置換のうちの1つ
コマンドが(標準出力に)出力したものを、
スクリプト内の、その場所に展開する
伝統的に command
というバッククォートによる表記が使われている
最近は $(command) とも書けるシェルが多い (これだと入れ子にできる)
変数
x=”abcde” のように代入( = の両側はスペース入れない)
echo $x のように参照( $ をつける。代入時には $ 不要)
コマンド名として呼び出されたスクリプトの中では、 コマンド名が $0 、
引数が $1 $2 …(位置パラメータとも呼ぶ)
制御構造
コマンドの区切り(区別して使うべし)
; &&& ||
その他の文法事項
行末に ( “ |
など
続きがあることを前提とした文字があると
継続行だと扱われる、が、
そうでないケースでは 行は終わっているとみなされる
例 ls | wc の場合:
|
のあと => OK
|
の前 => NG (単独の ls
が改行の時点で完結したと解釈される)
|
の前で改行するが改行の直前に \
=>
OK
()
ちなみにこの原則は昨今のスクリプト系言語全般にあてはまる
(文を必ずセミコロンで終端させる言語にはあてはまらない)。
変数 n を参照するときは、ブレースで囲んで ${n}
と書くのが正式だが、
変数名が普通の文字列のときはブレースは省略できる。
変数展開以外にも、ブレースの前に $
を置くことで、
様々な変換のパターンが用意されている。
${parameter:-word}
によるデフォルト値の指定(後述の「yes を作る」に使用例あり)一般にシェルスクリプトやプログラミング言語で文字列を囲むための文字は
シングルクオート‘…’
とダブルクオート “…”
である
(英文の組版では 左右非対称の文字が使われるがコンピュータ界では左右同じ文字)。
それに加えて、バッククオートという文字がASCII符号(およびキーボード)にあり、 シェルスクリプトではコマンド置換という重要な役割を 果たしている。
\ と ¥(ここではこの2つの記号が区別されている全角文字で表示しているが
本項は プログラミング等で多用される半角英数字+記号の世界の話)は、同じもの。
(日本のパソコン黎明期にASCII符号を輸入する際に通貨記号を追加する必要から 比較的使用頻度が低いと思われた’\’の場所に’¥’を押し込んだという事情による)
*
は、シェルでは特殊な文字(ワイルドカード)なので、
expr コマンド等に渡す時は'*’
のように
クオートで囲むか、
\*
のように、\
を前置してエスケープ(特殊記号の意味を無効に)する。
\
そのものを使う時には、2つ並べて使う(前者で後者の特殊な
意味をキャンセルする、と解釈しよう)。要点:
ゲストOSから、USBメモリ等の外部デバイスにアクセスできる(設定必要)
ゲストOSから、ホストOSのドライブにアクセスできる(同上;「共有」の機能)
Unix系OSには「ドライブ」(Windowsで c: d: など)の概念はなく、
「マウント」されて全体が1つの木構造として認識される
注)現在のbashには計算をさせる機能が内蔵されているが
ここではexprによる伝統的な方法を紹介する
expr 1 + 1 # 演算子と被演算子は離すこと
exprに渡す式は 演算子の両側をスペースで空ける必要がある。
(変数に代入する際に=の両側にスペースが入れられないのと対照的だが)
別の方法としてbcを使うこともできる。
echo 1+1 | bc
変数 n (に数値を(表す文字列)が入ってるとして)の値を変えるときは、
n=1 n=`expr $n \* 2`
のような(コマンド置換を使った)書き方を行う。
なお、乗算の記号 \*
は、*
がワイルドカード文字なので バックスラッシュ \
を前置してエスケープしている (クォートで囲んでもいい)。
bashではコマンド置換に2つの書き方がある(前述)。
ちなみにbashでは二重の括弧の中に数式(代入も含む)が書けるので
((n=n*2))
と書いてもいい。
なお、expr は 文字列操作のための機能もある。
expr 'abcdefg' : 'e..'