export HISTFILE=<新しいコマンド履歴ファイル名>とする。
if [ "${STY}" != "" ]; then
export HISTFILE=${HISTFILE_DIR}/${TERM}.${STY##*.};
fiexport 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##*.} # 拡張子を表示
$ basename <path>
$ basename /usr/bin/perl perl
$ dirname <path>
$ dirname /usr/bin/perl /usr/bin
変数 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";
donefor 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でもうまくいく。
$ command1 | command2 command3 | command4
${PIPESTATUS[@]}
に格納される。$ exit 3 | exit 5 | exit 2 | exit 0 | exit 1
$ echo ${PIPESTATUS[@]}
3 5 2 0 1$ command 2>&1 | tee <file-name>
(( 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)
$ bash -x <shell-script-file>
#!/bin/bash -x
$ bash -v <shell-script-file>
${FUNCNAME[1]}${BASH_LINENO[0]}function log_print {
local readonly msg="${@}";
local readonly func=${FUNCNAME[1]};
local readonly line=$(printf "%04d" ${BASH_LINENO[0]});
echo "${line}: ${func}: ${msg}";
# printf で複数の値を一度にフォーマットすることは出来ない。
}
function get_section_from_ini_file {
# 指定された ini file 形式のファイルから、指定されたセクションの内容を取り出し出力する
local ini_file=${1};
local section=${2};
sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/;.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
< ${ini_file} \
| sed -n -e "/^\[${section}\]/,/^\s*\[/{/^[^;].*\=.*/p;}";
}
function hoge {
local TEST=1;
...
}readonly OK=0; readonly NG=1;
function hoge {
local readonly TEST=1;
...
}#!/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"; # 最後に修正した日付を併記