export HISTFILE=<新しいコマンド履歴ファイル名>とする。
if [ "${STY}" != "" ]; then export HISTFILE=${HISTFILE_DIR}/${TERM}.${STY##*.}; fi
export HISTTIMEFORMAT="%F %T "
export PROMPT_COMMAND="history -a; history -r" shopt -o histappend # histappend は上記により不要になるので、無効にする
val=123
array=( 0 1 2 3 ) array=([0]=0 [3]=3 [1]=1 [2]=2 ) # 配列番号指定。記述は順番通りでなくても良い
unset val1 # 変数の削除 unset array[0] array[3] # 配列から、特定の要素のみを削除 unset array # 要素指定無しで配列を指定した場合、その配列全体を削除
$ echo {1..10} 1 2 3 4 5 6 7 8 9 10 $ echo {10..1} 10 9 8 7 6 5 4 3 2 1
A=() A=( 1 2 3 4 )
A=( ${A[@]} ${B} )又は
A+=( ${B} )
A=( ${B} ${A[@]} )
${VAR[@]:<begin>:<end>}
${VAR[@]:<begin>}
${VAR[@]::<end>}
A=( 0 1 2 3 4 5 6 ) echo ${A[@]:2:4} # 実行結果: 2 3 4 5 echo ${A[@]:2} # 実行結果: 2 3 4 5 6 echo ${A[@]::2} # 実行結果: 0 1
変数 | 意味 |
---|---|
$0 | シェル、あるいはプログラムの名前 |
$1 $2 ... | 引数 |
$@ | 引数の配列 |
$* | |
$# | 引数の数 |
$- | シェルの呼出し時に指定されたオプション |
$_ | 前のコマンドの最後の引数 |
$! | 最後に起動したバックグラウンドジョブのPID |
$? | 最後に実行したコマンドや関数のRETURN値 |
$$ | そのプロセスのPID |
変数 | 意味 |
---|---|
${#val[@]} | ${val} の長さ(文字列としてみた場合の文字数に相当) |
${#val} | 配列${val[@]} の配列数 |
変数 ${hoge} に対して
書法 | 意味 | 備考 |
---|---|---|
${hoge%<ptrn>} | 末尾から見て、<ptrn> に最も短く一致する部分を取り除いた値 | |
${hoge%%<ptrn>} | 末尾から見て、<ptrn> に最も長く一致する部分を取り除いた値 | |
${hoge#<ptrn>} | 先頭から見て、<ptrn> に最も短く一致する部分を取り除いた値 | |
${hoge##<ptrn>} | 先頭から見て、<ptrn> に最も長く一致する部分を取り除いた値 | |
${hoge/<ptrn>/<str>} | ${hoge} の値で<ptrn>に最も長く一致する最初の部分だけを<str>で置換する | <ptrn>が # で始まる場合は、hoge の先頭と一致しなければならない <ste>がNULLの場合は、一致した部分が削除される。 |
${hoge//<ptrn>/<str>} | ${hoge} の値で<ptrn>に一致する部分全てを<str>で置換する |
FULLPATH=/home/user/file_name.ext PATH=${FULLPATH%/*} # パス部分を表示 FNAME=${FULLPATH##*/} # ファイル名以下を表示 FNAME_ONLY=${FULLPATH%.*} # ファイル名のみを表示 DOTEXT=${FULLPATH##*.} # 拡張子を表示
変数 val に対して
書法 | 意味 | 備考 | |
---|---|---|---|
val が存在しNULLでない場合 | 左以外の場合 | ||
${val:-word} | valを返す | wordを返す | |
${val:=word} | valを返す | valにwordを設定して返す | 位置パラメータや特殊なパラメータは除く |
${val:?msg} | valを返す | val の後にmsgを出力し、現在のコマンド或はスクリプトを中止する(対話型シェルではない場合) msgを省略すると "parameter null or not set" を出力する。 | |
${val:+word} | wordを返す | NULLを返す | |
${val:offset} | サブ文字を展開する。 offsetの位置からlength文字の長さのサブ文字r列をvalから取り出す。 文字の位置は0からカウントする。 lengthが省略された場合は、offsetからvalの最後までが展開の対象になる。 offsetが負値の場合、開始位置はvalの終端からカウントされる。 valが@の場合、lengthはoffsetを先頭とする位置パラメータの番号になる。 | ||
${val:offset:length} |
記号 | 意味 |
---|---|
-z <string> | <string> の長さが 0 ならば真 |
-n <string> | <string> の長さが 0 でなければ真 |
string1 == string2 | 文字列が同じならば真。== の代わりに = でも可 |
tring1 != string2 | 2 つの文字列が異なれば真 |
string1 < string2 | 現 在のロケールにおいて、string1 が string2 よりも辞書順で前にある場合に真 |
string1 > string2 | 現在のロケールにおいて、string1 が string2 よりも辞書順で後に ある場合に真 |
if [ -n ${val} ]; then 処理1 fiではなく、
if [ ${#val} -gt 0 ]; then 処理1 fiとするとうまくいく。
記号 | 意味 |
---|---|
-d <file> | <file>が存在し、且つディレクトリである |
-e <file> | <file>が存在する |
-f <file> | <file>が存在し、且つ通常ファイルである |
-h <file> | <file>が存在し、且つシンボリックリンクである |
-r <file> | <file>にreadパーミッションが与えられている |
-s <file> | <file>が存在し、且つ空ではない |
-w <file> | <file>にwriteパーミッションが与えられている |
-x <file> | <file>にexecuteパーミッションが与えられている |
-O <file> | <file>の所有者である |
-G <file> | <file>のグループIDが自分のものと一致する(複数のグループに属している場合はそのいずれかと一致する) |
<file1> -nt <file2> | <file1>が<file2>よりも新しい(ファイル変更時刻を比較) |
<file1> -ot <file2> | <file1>が<file2>よりも古い(ファイル変更時刻を比較) |
記号 | 意味 |
---|---|
arg1 -eq arg2 | arg1 が arg2 に対して等しい |
arg1 -ne arg2 | arg1 が arg2 に対して等しくない |
arg1 -lt arg2 | arg1 が arg2 に対して小さい |
arg1 -le arg2 | arg1 が arg2 に対して小さいか、等しい |
arg1 -gt arg2 | arg1 が arg2 に対して大きい |
arg1 -ge arg2 | arg1 が arg2 に対して大きいか、等しい |
※ arg1, arg2 には、正または負の整数を使用出来る。
if [ 条件式1 ]; then 処理1 elif [ 条件式2 ]; then 処理2 else 処理3 fi
for i in "${val_list[@]}"; do 処理 if [ 次ループへ飛ぶ条件 ]; then continue; fi if [ ループ終了条件 ]; then break; fi done
for val in $(<command>); do 処理 done
for f in $(ls); do echo "file: $f"; done
for i in {1..10}; do 処理 done
とすれば出来る。但し、上の例の {1..10} はダブルクォートで括ってはいけないので注意!
seq <first_num> [increment_num] <last_num> seq [first_num] <last_num>
VALS=( a b c d e ); for i in `seq 0 5`; do # double-quote で括らないこと! echo "val is $VALS[$i]"; done
VALS=( a b c d e ); for i in `seq 5 -1 0`; do # double-quote で括らないこと! echo "val is $VALS[$i]"; done
VALS=( a b c d e ); for i in `seq 0 2`; do # double-quote で括らないこと! echo "val is $VALS[$i]"; done
while [ 条件 ]; do 処理 if [ 次ループへ飛ぶ条件 ]; then continue; fi if [ ループ終了条件 ]; then break; fi done
case ${i} in word_1 ) 処理1 ;; word_2 ) 処理2 ;; * ) 上記どの条件にも当てはまらない場合に行う処理 ;; esac
$ echo "message" >&1
$ echo "message" >&2
(1) A=( "Hello" "world" "\n" ); printf "${A[@]}"; (2) printf "${A[@]}\n"; (3) B=( "Hello" "world\n" ); printf "${B[@]}"; (4) C="Hello world\n"; printf "${C}\n";
alias llast1='ls -1tr | tail -1'みたいなことをしている場合に、そのファイルの内容をgrep して別ファイルに保存する場合は、
$ grep hoge `llast1` | grep -v huga > a.logとやってもうまくいかない。
$ cat < `llast1` | grep hoge | grep -v huga | tee a.logとやればうまくいく。または
$ ( cat `llast1` | grep hoge | grep -v huga ) | tee a.logでもうまくいく。
(( sum = $a + $b )) # addition (( sub = $a - $b )) # subtraction (( mul = $a * $b )) # multiplication (( div = $a / $b )) # division (( mod = $a % $b )) # modulo (remainder) (( exp = $a ** $b )) # exponentiation
sum=$( $a + $b ) # addition sub=$( $a - $b ) # subtraction div=$( $a / $b ) # division mod=$( $a % $b ) # modulo (remainder)
$ ls -A | grep ^\\. # スクリプトに書く場合は、 ^\\. を ^\\\. と書くここで、 "grep ^\." とすると、"." 以外で始まるファイルもリストされてしまうので注意。
#!/bin/bash TARGET=${1}; TARGET_FILE=`ls -1tr | tail -${TARGET} | head -1` echo ${TARGET_FILE};
#!/bin/bash # find ${@} find -printf "%AY-%Am-%Ad %p\n"; # 最後にアクセスした日付を併記 find ${@} -printf "%TY-%Tm-%Td %p\n"; # 最後に修正した日付を併記