ラベル bash の投稿を表示しています。 すべての投稿を表示
ラベル bash の投稿を表示しています。 すべての投稿を表示

2014年4月1日火曜日

シェルでコマンド履歴を検索する

「~/.inputrc」に以下の記述を追加すると上下矢印キーで履歴検索を行える

"\e[B":history-search-forward
"\e[A":history-search-backward

保存後

$ bind -f .inputrc

2010年8月11日水曜日

論理演算子の使われ方について

bashでも論理演算子の意味はC言語と同じ
けどシェルスクリプト内で変わった使われ方をしている部分を発見したので調べてみた

◆使われ方が独特な個所
[ -z "${COLUMNS:-}" ] && COLUMNS=80

普通、ANDやORは条件式で使われるのだが、if文がないけど
これいかに??


シェルスクリプトではこうゆう書き方が使われるようで
ある条件(左辺式)が成功(true:真)したら、別の条件(右辺式)を実行する
とゆう場合に使われるらしい

ANDの場合、左辺の条件式を先に判断し失敗(false:偽)だった場合、右辺は評価しない
なので上記の例だと

COLUMNSがnullだった場合、COLUMNSに80をセットする

という意味になる。

また、ORも同じような感じで使われるようで
左辺式が失敗(false:偽)した場合、右辺式を実行する
という感じで使われる。

例えば、あるファイルが存在していない場合、スクリプトを終了する場合など
[ -f "とあるファイル" ] || exit 0



ま、C言語に慣れた人だとifを使えよ!!
と言いたくなる書き方だけどね

2010年8月10日火曜日

展開の演算子

他にも以下のような展開の演算子があるのでまとめてみた

展開の演算子意味
${変数:-規定値}変数が定義されていてnullではないとき変数の値を返し、それ以外で規定値を返す
${変数:=規定値}上と同じだが、規定値を変数にセットするとこが違う
${変数:?メッセージ}変数が定義されていてnullではないとき変数の値を返し、それ以外でメッセージを出力しスクリプトを終了する
${変数:+規定値}変数が定義されていてnullではないとき規定値を返し、それ以外でnullを返す


2010年8月9日月曜日

環境変数

◆環境変数の定義
$ export 変数名=値     <--- data-blogger-escaped-br="" data-blogger-escaped-value_abc="TEST" data-blogger-escaped-x.="">

◆定義されている環境変数の確認
$ export -p

◆環境変数の削除
$ unset 変数名


シェル変数

httpdスクリプトを眺めていて以下の文が分からなかった

HTTPD_LANG=${HTTPD_LANG-"C"}

HTTPD_LANGとゆう変数に値をセットしているってことは何となく分かるけどハイフン('-')と"C"は何を意味するん??
でもって、調べたところ
${変数名}は変数名の区切りを分かりやすくするために{}でくくっているものと理解!

例えば、変数名がVALUEという名前だった場合、${VALUE}とする。
なぜそのようにするかといえば、

$ echo $VALUEA

とした場合、VALUEAまでが変数名なのか、VALUEに続いてアルファベットAを表示させたいのかが分からなくなってしまうからである。
(ちなみに上の例ではVALUEAが変数名となる)

そして肝心の{}でくくられたハイフンの意味はHTTPD_LANGが定義されていなければ??(それともHTTPD_LANGに何もセットされていなければ??)、"C"をセットするとゆう意味らしい。

後でもうちょい調べよう

追跡取材でハイフンの意味が分かりました
${変数名-値}


${変数名:-値}

のコロン(:)を省略した形で変数が存在した場合、変数名の値を返し
存在しない場合、値を(ハイフンの右側の値)返すという意味らしく
「変数展開」と呼ぶものみたいだ
なので、上記の例
HTTPD_LANG=${HTTPD_LANG-"C"}

は、HTTPD_LANGが定義されている場合、
HTTPD_LANGの値をそのままセットし
定義されていない場合
"C"をHTTPD_LANGにセットするという意味になる

2010年7月29日木曜日

ドットコマンド「.」

ドットコマンド「.」を使うと、指定したスクリプトファイルに記述されている変数や関数がカレントシェルで使えるようになるってことらしい。
うーん、いまいち意味が・・・

てことで早速実践
まずは下のようなスクリプトを作成する

dottest.sh:
#!/bin/sh
DOTTEST="Dot Test だよーん"


して、まずはスクリプトを実行しない状態でDOTTESTを確認してみる
$ echo $DOTTEST


何も表示されない

してして次に~ドットコマンドを使ってスクリプトを読み込んでみる
$ . ./dottest.sh


先ほどと同じようにDOTTESTを確認してみると・・・
$ echo $DOTTEST
Dot Test だよーん


あらまっ、表示されました
関数も同じようにスクリプトに記述しておけばいいらしい

dottest.sh:
#!/bin/sh
DOTTEST="Dot Test だよーん"

function dottest_disp()
{
    echo $DOTTEST
}

と、さっきのファイルを修正して同じようにスクリプトを実行しない状態だと
$ dottest_disp
-bash: dottest_disp: command not found


そんなのないよだけど
$ . ./dottest.sh


を実行した後だと

$ dottest_disp
Dot Test だよーん


のような結果になりました