実行開始時刻が分かるシェルスクリプト
bashの練習です。
$@または$*を使えば、引数を全て引用できます。
date_ () { date && $@ ;}
または
date_ () { date && $* ;}
です。
実行してみます。
$ date_ ls -l 2014年 2月10日 月曜日 17時02分52秒 JST total 1744 drwx------+ 7 riocampos staff 238 11 18 17:58 Applications drwx------+ 51 riocampos staff 1734 2 10 03:00 Desktop drwx------+ 19 riocampos staff 646 2 2 14:58 Documents drwx------+ 150 riocampos staff 5100 2 7 14:39 Downloads drwx------@ 35 riocampos staff 1190 2 9 14:00 Dropbox drwx------+ 58 riocampos staff 1972 2 6 23:23 Library drwx------+ 11 riocampos staff 374 1 25 18:15 Movies drwx------+ 8 riocampos staff 272 12 1 18:40 Music drwx------+ 10 riocampos staff 340 11 25 14:47 Pictures drwxr-xr-x+ 5 riocampos staff 170 3 18 2013 Public drwxr-xr-x+ 5 riocampos staff 170 3 18 2013 Sites
$@と$*のちがいは
今回の使い方では違いが出ません。引用符に括った("$@" / "$*")ときに違ってくるとのこと。
位置パラメータのリストを表す変数$*と$@には $1 $2 $3… という形式で値が保持されているが、両者には少し使用方法に違いがある。
まず、$*と$@は、ダブルクォーテーション(")で囲まれていない場合、両者に違いはない。
位置パラメータに$1=a, $2=b, $3=cと三つの値がある場合、" で囲まれている場合、$*は "a b c" と一つの文字列として展開される。それに対し、$@は"a" "b" "c"とダブルクォーテーションで囲まれた三つの文字列として扱われる。
$*と$@の違い - 技術整備
- $*
シェルの予約変数IFSに値をセットしておくと、区切り文字を変更することができます。この場合はダブルクオーテーション(")で囲む必要があります。例えば以下のように使用できます。
$ IFS=: $ echo "$*" a:b:c:d
- $@
上記「$*」とほとんど同じですが、予約変数「IFS」の影響は受けません。つねに区切り文字は空白です。
上記「@」と「*」は上記で紹介したbash version2.0 の機能である配列変数にも応用できます。$ IFS=: $ array=(a b c d) $ echo "${array[*]}" a:b:c:d $ echo "${array[@]} a b c d