ksh はプログラム言語として、 いくつかの構文とそこで使う変数から構成されています。 ksh で書かれたプログラムは、シェルスクリプトとよばれ、 実行権限を付与すると、そのまま実行することができます。 簡単な特徴を以下に列挙します。
変数でも定数定義で使う場合はすべてを大文字で、 変数として使う場合は小文字で、名前を付けましょう。 変数は配列でもよく、その添え字は0からはじまり、使用できる次元は1次元のみです。
変数に値を設定するには、以下のいずれかの構文が可能です。
= の前後には空白ががあってはなりません。
変数名=値 変数名="値" 変数名='値' 配列名[添え字]="値" 配列名[添え字]='値'
#!/bin/ksh val="12345" val_default="abcde" echo "Value of val_default .... $val_default" echo "Value of val +_default .... ${val}_default"
実行結果
Value of val_default .... abcde Value of val +_default .... 12345_default
なお、 solaris では、ksh と sh は同じです。
文種 | 書式 | 例および特記事項 |
---|---|---|
行頭 | #!/bin/ksh | #! に続くプログラムをインタプリタとして使いファイルを実行する |
コメント | # コメント | # This is a comment |
継続行 | 行末に \ | echo aaaaaaaa \ bbbbb |
true | true | 終了ステータスが 0 のコマンド (nop) |
選択文 |
if [[ 式 ]] ; then コマンド群 elif [[ 式 ]] ; then コマンド群 else コマンド群 fi |
if [[ $1 -nt $2 ]]; then exit 0 else exit 1 fi |
case $str in
str1) コマンド群 ;; str2 | str3) コマンド群 ;; *) <-- default コマンド群 ;; esac |
OSNAME=$(uname) case $OSNAME in Linux) dmesg > $SYSLOG_OUTFILE ;; # not supported iostat COMMAND SunOS) dmesg > $SYSLOG_OUTFILE IOOPT=-x ;; HP-UX) alias pscmd="ps -ef" alias dfcmd="bdf" IOOPT=-t ;; AIX) alias pscmd="ps -e -o user,pid,ppid" IOOPT=-d ;; *) echo "Not support $OSNAME.";exit 3 ;; esac | |
繰返し文 |
for 変数名 in 単語のリスト do コマンド群 done |
RESULT=/tmp/res.out for ARG in "$@" do echo $ARG done > RESULT 2>&1 |
while 式 do コマンド群 done 無限ループ 数値 式が真である間実行 |
let n=0 while read line do let n=$n+1 echo "$n: $line" done < $0 echo "Total lines are $n ." | |
until 式 do コマンド群 done 式が真になるまで実行 |
MAX_LOOP=100 let n=0 until (( $n == $MAX_LOOP )) do : let n=$n+1 done | |
shift n | 位置パラメータの値を n 左に移動させる。 | |
制御移行文 | break N | 最も内側の N 個のループから抜ける |
continue N | 最も内側の N 個のループの次の繰り返しへ実行を移す | |
goto ラベル | ラベルに分岐します | |
exit 式 | 式の値は $? に設定される $AWK -f $AWK_PRG $INFILE INFO=$INFOFILE > $OUT let ret=$? ls -l $OUT exit $ret | |
return 式 | 式の値は関数の戻り値となる | |
( コマンド群 ) | グループ化したコマンドをサブシェルで実行 | |
{ コマンド群 } | グループ化したコマンドを現シェルで実行 | |
現セッションとして実行 | . スクリプト名 | alias/setenv を現セッションで有効にできる |
OS コマンド 実行 1 |
$(OS コマンド) | set -A DIR_NMS $(ls) : DIR_NMS 配列に `ls` の結果 MAX_DIR=${#DIR_NMS[*]} : MAX_DIR に ls の個数 ただしファイル数が多い場合、配列がオーバーフローしエラー 配列の最大サイズは 1024 です。 alias datecmd='date +"%Y %m %d"' TODAY=$(datecmd) |
OS コマンド 実行 2 |
`OS コマンド` | MAX_LNO=`cat $TMP | wc -l`: MAX_LNO に $TMP の行数を入れる |
項目 | 定義 | 例 |
---|---|---|
定義 | function 名前 { ブロック return N } 引数は $1 .... $9 |
function outTTL { typeset AA print "\n ==[ $2 ]==\n" >> $1 } |
参照 | 関数名 引数列 | outTTL $OUT_FILE $FULL_FILE_NM |
関数内にローカルな変数を定義するには、typeset を使います。
グローバルな変数と同じ名前でも、typeset 宣言された変数は区別されます。
typeset だけを入れると、現在定義されている変数をすべてリストします。
変数の書式については、書式指定変数を参照してください。
例
#!/bin/ksh function prtTest { typeset -R10 v1_r10 v2_r10 v3_r10 typeset -L10 v1_l10 v2_l10 v1_z10 typeset -Z10 v1_z10 v2_z10 v3_z10 print "$1 $2 $3" v1_r10=$1 v1_l10=$1 v1_z10=$1 v2_r10=$2 v2_l10=$2 v2_z10=$2 v3_r10=$3 v3_l10=$3 v3_z10=$3 print '===== test datas =====' print "1=$1" print "2=$2" print "3=$3" print '===== results =====' print "R10 : $v1_r10 , $v2_r10 , $v3_r10" print "L10 : $v1_l10 , $v2_l10 , $v3_l10" print "Z10 : $v1_z10 , $v2_z10 , $v3_z10" } v1="abcdefghijklmnopqrstuvwxyz" v2="ABCDEFGHIJKLMNOPQ" v3="12345" prtTest $v1 $v2 $v3 exit 0 実行結果 ozzy-7 09/02 11:11am] t_prt ===== test datas ===== 1=abcdefghijklmnopqrstuvwxyz 2=ABCDEFGHIJKLMNOPQ 3=12345 ===== results ===== R10 : qrstuvwxyz , HIJKLMNOPQ , 12345 L10 : abcdefghij , ABCDEFGHIJ , 12345 Z10 : qrstuvwxyz , HIJKLMNOPQ , 0000012345
演算子と変数の間には空白があってはいけません。
もし空白を入れたい場合は " で囲みます。
記法 | 意 味 | 例 | cnt(cnt=6) (num=10) |
---|---|---|---|
= | 式の値を変数に代入 | let cnt=6 | 6 |
+ | 加算 | let cnt=" $num + 4" | 14 |
- | 減算 | let cnt=" $num - 5" | 5 |
* | 乗算 | let cnt=" $num * 10" | 100 |
/ | 割算 | let cnt=" $num / 6" | 1 |
% | 剰余 | let cnt=" $num % 3" | 1 |
>> | 右シフト | let cnt=" ($num >> 2)" | 2 |
<< | 左シフト | let cnt=" ($num << 2)" | 80 |
~ | 1 の補数 | let cnt=" ~$num" | -11 |
! | 論理否定 | let cnt=" !$num" | 0 |
| | ビット毎の or | let cnt=" ($num | 7)" | 15 |
^ | ビット毎の exclusive or | let cnt=" ($num ^ 7)" | 13 |
& | ビット毎の and | let cnt=" ($num & 6)" | 2 |
|| | 論理和 | let cnt=" ($num>8 || $num <4)" | 1 |
&& | 論理積 | let cnt=" ($num>4 && $num <8)" | 0 |
この場合は、 (( )) で囲まなければなりません。 また括弧のなかの式と括弧の間には、空白がなければなりません。
sh の場合は、"((" の代わりに "[" を、"))" の代わりに "]" を使います。
記法 | 意味 | 例: let XXX=10;let YYY=0 | 結果 |
---|---|---|---|
== | 等しい | if (( $XXX == 10 ));then echo YES;fi; | YES |
!= | 等しくない | if (( $XXX != 10 ));then echo NO;fi; | |
>= | 大きいか等しい | if (( $XXX >= 10 ));then echo YES;fi; | YES |
> | 大きい | if (( $XXX > 10 ));then echo NO;fi; | |
<= | 小さいか等しい | if (( $XXX <= 10 ));then echo YES;fi; | YES |
< | 小さい | if (( $XXX < 10 ));then echo NO;fi; | |
&& | 論理 and | if (( $XXX < 10 && $YYY <0 ));then echo NO;fi; | |
|| | 論理 or | if (( $XXX < 10 || $YYY <0 ));then echo NO;fi; | |
この場合は、 [[ ]] で囲まなければなりません。 また括弧のなかの式と括弧の間には、空白がなければなりません。
演算子 | 意 味 | 例:let no=6 | 結果 |
---|---|---|---|
exp1 -eq exp2 | exp1 と exp2 が等しいなら真 | if [[ $no -eq 6 ]];then echo YES;fi; | YES |
exp1 -ne exp2 | exp1 と exp2 が等しくないなら真 | if [[ $no -ne 6 ]];then echo NO;fi; | |
exp1 -lt exp2 | exp1 < exp2 なら真 | if [[ $no -lt 6 ]];then echo NO;fi; | |
exp1 -gt exp2 | exp1 > exp2 なら真 | if [[ $no -gt 6 ]];then echo NO;fi; | |
exp1 -le exp2 | exp1 <= exp2 なら真 | if [[ $no -le 6 ]];then echo YES;fi; | YES |
exp1 -ge exp2 | exp1 >= exp2 なら真 | if [[ $no -ge 6 ]];then echo YES;fi; | YES |
この場合は、 [[ ]] で囲まなければなりません。 また括弧のなかの式と括弧の間には、空白がなければなりません。
演算子 | 意 味 | 例:str="oracle";str1="AZ";str2="BZ" | 結果 |
---|---|---|---|
-n string | string の長さがゼロでなければ真 | if [[ -n $str ]];then echo YES;fi; | YES |
-o option | option が設定されていれば真 | if [[ -o $str ]];then echo NO;fi; | |
-z string | string の長さがゼロならば真 | if [[ -z $str ]];then echo NO;fi; | YES |
string = pattern | string と pattern が一致すれば真 | if [[ $str = "oracle" ]];then echo YES;fi; | YES |
string != pattern | string と pattern が一致しなければ真 | if [[ $str != "oracle" ]];then echo NO;fi; | |
string1 < string2 | string1 < string2 なら真 | if [[ $str < "ORACLE" ]];then echo NO;fi; | |
string1 > string2 | string1 > string2 なら真 | if [[ $str > "ORACLE" ]];then echo YES;fi; | YES |
(expression) | expression が真なら真 | if [[ ($str = [a-z]*) ]];then echo YES;fi; | YES |
! expression | expression が偽なら真 | if [[ ! ($str = [A-Z]*) ]];then echo YES;fi; | YES |
exp1 && exp2 | exp1 と exp2 が真なら真 | if [[ ($str1 = [A-Z]*) && ($str2 = [A-Z]*) ]];then echo YES;fi; | YES |
exp1 || exp2 | exp1 か exp2 が真なら真 | if [[ ($str1 = "AZ") || ($str2 = "AZ") ]];then echo YES;fi; | YES |
演算子 | 説明 | 例 path=/home/build/long.file.name |
---|---|---|
${変数名#パターン} |
パターンの始めに合致した 最小部分を削除した残余 |
${path#/*/}=build/long.file.name |
${変数名##パターン} |
パターンの始めに合致した 最長部分を削除した残余 |
${path##/*/}=long.file.name |
${変数名%パターン} | パターンの最後に合致した 最小部分を削除した残余 |
${path%.*}=/home/build/long.file for f in *.foo; do mv $f ${f%foo}bar done |
${変数名%%パターン} |
パターンの最後に合致した 最長部分を削除した残余 |
${path%%.*}=/home/build/long |
例
#!/bin/ksh FILE1="file1.html" FILE2="file2.htm" FILE3="file3.css" FILE4="file4.gif" # pickup file extentions sufix1=${FILE1#*.} sufix2=${FILE2#*.} sufix3=${FILE3#*.} sufix4=${FILE4#*.} print "sufix list : 1=$sufix1 2=$sufix2 3=$sufix3 4=$sufix4" if [[ $sufix1 = "html" || $sufix1 = "htm" ]];then echo "sufix1 : $sufix1 is HTML" fi if [[ $sufix2 = "html" || $sufix2 = "htm" ]];then echo "sufix2 : $sufix2 is HTML" fi if [[ $sufix3 = "html" || $sufix3 = "htm" ]];then echo "sufix3 : $sufix3 is HTML" fi if [[ $sufix4 = "html" || $sufix4 = "htm" ]];then echo "sufix4 : $sufix4 is HTML" fi 実行結果 ozzy-47 09/02 11:41am] t_pat sufix list : 1=html 2=htm 3=css 4=gif sufix1 : html is HTML sufix2 : htm is HTML
演算子 | 真となる条件 | 例 | 結果 |
---|---|---|---|
-a file | ファイルは存在する | if [[ -a $HOME/.cshrc ]];then echo YES;fi | YES |
-b file | ファイルは存在し、ブロック型である | if [[ -b /dev/null ]];then echo YES;fi | |
-c file | ファイルは存在し、文字型である | if [[ -c /dev/stdin ]];then echo YES;fi | YES |
-d file | ファイルはディレクトリ | if [[ -d $HOME ]];then echo YES;fi | YES |
-f file | ファイルは普通のファイル | if [[ -f $HOME/.cshrc ]];then echo YES;fi | YES |
-g file | ファイルは存在し、setgid が設定されている | if [[ -g $HOME/.cshrc ]];then echo YES;fi | |
-k file | ファイルは存在し、sticky が設定されている | if [[ -k /opt/SWAP ]];then echo YES;fi | |
-p file | ファイルは存在し、fifo である | if [[ -p /tmp/.X11-pipe/X0 ]];then echo YES;fi | |
-r file | ファイルをユーザが読める | if [[ -r $HOME/.cshrc ]];then echo YES;fi | YES |
-s file | ファイルは存在し、0 より大きい | if [[ -s $HOME/.cshrc ]];then echo YES;fi | YES |
-t N | ファイルディスクリプタ N が端末である | if [[ -t 1 ]];then echo YES;fi | YES |
-u file | ファイルは存在し、setuid が設定されている | if [[ -u $HOME/.cshrc ]];then echo YES;fi | YES |
-w file | ファイルは存在し、ユーザが書ける | if [[ -w $HOME/.cshrc ]];then echo YES;fi | YES |
-x file | ファイルは存在し、ユーザが実行できる | if [[ -x /bin/ksh ]];then echo YES;fi | YES |
-G file | ファイルは存在し、グループ id はシェル と同じ | if [[ -G $HOME/.cshrc ]];then echo YES;fi | YES |
-L file | ファイルは存在し、シンボリックリンクである | if [[ -L /usr/lib/libcrypt.so ]];then echo YES;fi | YES |
-O file | ユーザはファイルの所有者 | if [[ -O $HOME/.cshrc ]];then echo YES;fi | YES |
-S file | ファイルは存在し、ソケットである | if [[ -S /var/tmp/.oracle/sora817 ]];then echo YES;fi | YES |
F1 -nt F2 | ファイルは存在し、F2 より新しい | if [[ .cshrc -nt $HOME/.cshrc ]];then echo YES;fi | YES |
F1 -ot F2 | ファイルは存在し、F2 より古い | if [[test.c -ot test.o ]];then echo YES;fi | YES |
F1 -ef F2 | ファイルは存在し、ファイルが同じファイルを参照 | if [[ /usr/lib/libcrypt.so -ef /lib/libcrypt.so.1 ]];then echo YES;fi | YES |
意 味 | 記法 | 例 | 結果 |
---|---|---|---|
変数名 | [a-zA-Z0-9_]+ | aaa,aaa_,_aaa_ | |
定義 | 変数名=値 = の前後に空白があってはならない |
d=$(date) echo $d |
Fri Aug 19 13:57:20 JST 2005 |
参照 | ${ 変数名 } ただし {} は省略可能 | echo ${HOME} | /home1/taka |
文字列長 | ${# 変数名 } | echo ${#HOME} | 11 |
デフォルト設定 | ${変数名:-デフォルト } 変数名があり、NULL でない場合はその値。 それ以外はデフォルトが設定される |
print ${DEF:-10} | 10 |
デフォルト設定 | ${変数名:=デフォルト } 変数名がないか、NULL の場合はデフォルトが設定される。 その後値が設定される |
print ${DEF:=10} | 10 |
NULL チェック | ${変数名:+値 } 変数名があり、NULL でない場合は値。 それ以外は NULL を返す |
print ${DEF:+10} | 10 |
readonly 変数の定義 | readonly 変数名 | readonly ORACLE_HOME |
ksh の配列は、1次元のみで、その要素は 1024 までに制限されています。
添え字は、0からはじめますが、連想配列と考えてよいでしょう。
つまり、添え字はかならずしも連続している必要はありません。
項目 | 内 容 | 結 果 |
---|---|---|
初期化 |
set -A aryname name1 name2 end print ${aryname[*]} |
name1 name2 end |
値を代入 |
nm[2]=bob nm[3]=tiger print ${nm[*]} |
bob tiger |
要素を参照する | print "listno= ${aryname[0]},${aryname[1]}" | listno =name1,name2 |
要素数を知る | print "listno= ${#aryname[*]}" | listno =3 |
要素長を知る | print "0=${#nm[0]} 1=${#nm[1]} 2=${#nm[2]} 3=${#nm[3]}" | 0=0 1=0 2=3 3=5 |
alpha=" aBcDeFgHiJkLmNoPqRsTuVwXyZ "
numval="123.50"
typeset の文字列書式オプション | ||
---|---|---|
Opt | 操作 | 例 |
-Ln | 左揃え。先頭の空白は削除。 n を指定した場合、空白を入れて n に長さを揃える。 |
-L ="aBcDeFgHiJkLmNoPqRsTuVwXyZ " -L10 ="aBcDeFgHiJ" |
-Rn | 右揃え。末尾の空白は削除。 n を指定した場合、空白を入れて n に長さを揃える。 |
-R =" aBcDeFgHiJkLmNoPqRsTuVwXyZ" -R16 ="kLmNoPqRsTuVwXyZ" -R8 =" 123.50" |
-Zn | 右揃え。末尾の空白は削除。 n を指定した場合、数値の場合は 0 を入れて n に長さを揃える。 |
-Z8 =" VwXyZ" -Z8 ="00123.50" |
-l | 小文字変換 |
-l =" abcdefghijklmnopqrstuvwxyz " |
-u | 大文字変換 |
-uR5 ="WXYZ" |
typeset の型、属性オプション | ||
Opt | 操作 | 例 |
-in |
変数を内部で整数表現する。
n を指定すると、出力の基数とする。 |
typeset -i numcolms=5 |
-r |
変数を読み出し専用とする。
代入禁止し、unset も禁止 |
typeset -ri numcolms=5 |
-x | エクスポートする。 | typeset -xi numcolms=5 |
typeset の関数オプション | ||
Opt | 操作 | 例 |
-f | 引数なしで、すべての関数定義を表示する | typeset -f |
-f fnm | 関数名で指定された関数の定義を表示する | typeset -f outTTL |
+f | すべての関数名を表示する | typeset +f |
-ft fnm | 指定された関数のトレースをオンにする | typeset -ft outTTL |
+ft fnm | 指定された関数のトレースをオフにする | typeset +ft outTTL |
-fu fnm | 指定された関数を自動ロードする | typeset -fu outTTL |
-fx fnm | 指定された関数をエクスポートする | typeset -fx outTTL |
シェル変数名 | 意 味 | 既定値 |
---|---|---|
CDPATH | cd コマンドで検索すべきディレクトリリスト | |
COLUMNS | 表示のカラム幅 | |
EDITOR | 使用したいエディタを指定 | |
ERRNO | 最も最近異常終了したシステムコールの errno | set |
ENV | シェルを起動したとき実行すべき環境ファイル名 | |
IFS | トークンの区切りとして認識する文字 | ,\t,\n |
HISTFILE | ヒストリファイル名 | |
HISTSIZE | ヒストリファイルに保持する行数 | |
LINENO | 実行中のスクリプトの行番号 | set |
OLDPWD | 前の作業ディレクトリ | |
OPTARG | getopts によって処理されるオプションへの引数 | |
OPTIND | オプションの後ろの最初の引数の番号 | |
PATH | コマンドの検索パス | |
PS1,PS2,PS3,PS4 | プロンプト文字列を設定する。 | $ |
PPID | 親プロセスの PID | |
PWD | 現在の作業ディレクトリ | |
RANDOM | 乱数 | |
REPLY | select コマンドのユーザの応答 read コマンドで変数を指定しなかったときの結果を格納 |
|
SECONDS | シェルが起動されてからの秒数 | |
SHELL | シェルのフルパス | |
TMOUT | シェルを自動的に終了させる秒数 | |
# | スクリプトまたは関数の引数の数 | echo $# |
_ | 前のコマンドの最後の引数 | echo $_ |
? | コマンドの終了コード | echo $? |
$ | シェルのプロセス番号 | echo $$ |
- | シェルに設定されているオプション | echo $- |
! | バックグランドで実行中のプロセス番号。 | echo $! |
記法 | 意 味 | 例 |
---|---|---|
$# | 引数の総数 $0 は含まない実質の数 |
if (( $# != 3)); then exit $# fi |
$* | 全引数で、1つの文字列を表す $0 は含まない |
for ARG in "$*" do echo $ARG done |
$@ | 全引数で、それぞれ別文字列を表す $0 は含まない |
for ARG in "$@" do echo $ARG done |
$0 | 引数 0 すなわちスクリプト名 | echo "$0" |
$1 $2 ... $9 | 引数 1,2,...,9 | echo "$1" |
ksh でのメタ文字または特殊文字について説明します。
メタ文字 | 意 味 | 例 |
---|---|---|
~ | ホームディレクトリ | cd ~taka |
$ | 変数識別子 | $HOME |
$! | 直前に呼び出した子プロセスの番号 | kill $! |
$- | シェルに与えられたフラグ | |
<,>,&,! | 入出力の切換え | echo $HOME > /tmp/out |
!,^ | 履歴 | !vi |
$$ | 起動中のシェルのプロセス番号 | set out=/tmp/$$.out |
; | コマンド区切り | cd;pwd |
() | コマンドグループ | (cd; make) |
`コマンド` | コマンド置き換え | set file = `ls` |
& | バックグラウンドジョブ | tst & |
\,'," | 文字をエスケープする | echo '$HOME' |
\ | 次文字をエスケープする | |
echo \$HOME | 継続行であることを示す。前に空白が必要 | XXXXXXX \ |
*,?,[,],,{,},|,~,- | ファイル名展開 文字として扱いたい場合はエスケープします (\) |
ls t?.* |
# | コメント | |
| | パイプ | ls | more |
引用符 | 意 味 | 例 | 結果 |
---|---|---|---|
' | この引用符で囲まれた文字列中のメタ文字は無視します | echo '$HOME' | $HOME |
" | この引用符で囲まれた文字列中の $ ` \ 以外のメタ文字は無視します | echo "$HOME" | /home1/taka |
` | この引用符で囲まれた文字列をコマンドとして実行します () | ; 等も使えます |
echo `ls` | t1 |
特殊文字 | 意 味 | 例 |
---|---|---|
; | コマンドを区切る | cd XXX;pwd |
() | コマンドをグループにまとめる | (ls >/dev/tty) >& /dev/null |
| | stdout を stdin にパイプする | ls|more |
|& | stdout と stderr を stdin にパイプする | ls|& echo |
&& | 前コマンドが成功したら次を実行する | make && run |
|| | 前コマンドが失敗したら次を実行する | make >& out || cat out |
& | バックグランドで実行する | make & |
!* | コマンド行の引数を受け渡す | ls \!* |
コマンド/操作 | 説明 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'....' | 文字列定数(リテラル)として扱われる。 | ||||||||||||||||||||||
"....." |
文字列定数(リテラル)として扱われる。 ただし、下記の文字は特別な意味を持ち、その点が '.....' とは異なる。
|
||||||||||||||||||||||
$'....' |
$'.....' では、C言語の文字列定数と同じように次の文字置き換えが行われる。
|
コマンド | コマンド形式/意味 |
組込みコマンド | |
history |
history [-c] [n] コマンドヒストリのリストを表示する -c ヒストリリストをクリアする n 表示するエントリ数 history -anrw [filename] コマンドヒストリの内容に追加したり、内容をファイルに書き出す -a ヒストリリストの最後にコマンドを追加する -n ヒストリファイルからまだ読込んでいないコマンドを ヒストリリストの末尾に追加する -r ヒストリファイルからヒストリを読込み、 その時点のヒストリリストの末尾に追加する -w ヒストリファイルにその時点のヒストリリストを書き出す history -ps arg -s argを一つのエントリとしてヒストリリストの末尾に追加する -p ヒストリ展開を行い、結果を標準出力に出力する ヒストリには追加しない |
fc |
fc [-e ename] [first] [last] コマンドヒストリの内容をエディタに読み込み、編集後実行する -e ヒストリエントリを編集するときのエディタを指定する 省略すると$FCEDITがエディタとなる(未定義時はvi) first エントリの番号または先頭部分の文字列 編集する最初のエントリを表す last エントリの番号または先頭部分の文字列 編集する最後のエントリを表す fc -l[nr] [first] [last] ヒストリリストの内容を標準出力に出力する。 -ln で標準出力に出力するとき、番号を出力しない -lr で標準出力に出力するとき、番号の逆順に出力する fc -s [pat=rep] [cmd] コマンドヒストリ中のエントリを実行する pat=rep patのパターンをrepに置き換える cmd エントリの番号または先頭の文字列 cmdで指定したエントリが実行される |
ヒストリ展開の中で使うEvent Designator | |
!n | ヒストリ中のn番のコマンドを実行する |
!-n | n個前のコマンドを実行する |
!! | 直前のコマンドを実行する。!-1と同じ。 |
!string | stringで始まるコマンドで、最後に実行されたものを実行する。 |
!?string[?] | stringを含むコマンドで、最後に実行されたものを実行する。 |
^string1^string2^ | 直前のコマンドのstring1をstring2に置き換えて実行する !!:s/string1/string2/と同じ。 |
!# | |
ヒストリ展開の中で使うWord Designator | |
:0(ゼロ) | コマンド行の0番目のワード(通常コマンド名)と置き換わる |
:n | コマンド行のn番目のワードと置き換わる |
:^ | 最初の引数と置き換わる |
:$ | 最後の引数と置き換わる |
:% | 最後に?string?で検索したワードと置き換わる |
:x-y | コマンド行のx番目からy番目の範囲にあるワードと置き換わる |
:* | コマンドの引数全部と置き換わる。'1-$'と同じ。引数がない場合は空文字列がとなる |
:x* | 'x-$'と同じ |
:x- | 'x-$'と同じだが、最後のワードは含まない |
ヒストリ展開の中で使うModifier | |
:h | パス名から末尾のファイル名部分が取り除かれ、ディレクトリ部分だけになる |
:t | パス名から末尾のファイル名以外の部分が取り除かれ、最後のファイル名だけになる |
:r | ファイル名のピリオド以後のサフィックスが取り除かれ、ベースネームの部分だけになる |
:e | ピリオド以後のサフィックだけを残し、他を取り除く |
:p | ヒストリ展開などを行った結果を表示するだけで、そのコマンドを実行しない。 |
:q | Quote the substituted words, escaping further substitutions. |
:x | Quote the substituted words as with `q', but break into words at spaces, tabs, and newlines. |
:s/old/new/ | oldをnewに置き換える |
:& | 直前の置き換えを繰り返す |
:g | Cause changes to be applied over the entire event line. Used in conjunction with `s', as in gs/old/new/, or with `&'. |
コマンド | コマンド形式と意味 |
バックグラウンド実行 | command & コマンドの末尾に&をタイプすると、バックグラウンドで実行する。実行すると |
サスペンド文字 | ctrl-Z 実行中のプロセスをサスペンド状態にする。 |
bg |
bg [jobspec] 中断中のジョブをバックグラウンド実行に切替える。 |
disown |
disown [-ar] [-h] [jobspec ...](2.2) アクティブジョブテーブルから削除する。 |
fg |
fg [jobspec] 中断中のジョブをフォアグラウンド実行に切替える。 |
jobs |
jobs [-lnp][ jobspec ... ] 中断中、もしくはバックグラウンドで実行中のジョブを表示する。 -l 通常の表示内容に加えてプロセスIDも表示する -n Display information only about jobs that have changed status since the user was last notified of their status. -p プロセスIDだけ表示する。 -r 実行中のジョブだけを対象にする。(2.2) -s 中断中のジョブだけを対象にする。(2.2) jobs -x command [ args ... ] |
kill |
kill [-n signum | -s sigspec | -sigspec] [pid | jobspec] ... プロセスにシグナルを送る。 kill -l [signum] シグナルを一覧表示する。シグナルの詳細は"man 7 signal"で参照。 |
suspend |
suspend [-f] 実行中のシェルを中断する。 |
wait |
wait [jobspec|pid] ジョブの終了を待つ。 |
stty | tostop 端末出力の抑制 -tostop 端末出力の抑制解除 |
%番号 | ジョブ番号が番号に一致するジョブを指す |
%string | stringで始まるジョブを指す |
%?string | stringを含むジョブを指す |
%% | 直前に最後に中断状態に移行したジョブ |
%+ | 直前に最後に中断状態に移行したジョブ |
%- | %+の一つ前に中断したジョブ |
シェルは << を見つけると、それに続く文字列 END-OF-FILE を EOF マークとして覚えます。 そして、その直後の行から次の EOF マークの直前の行までを コマンド grep への入力に結合します。
ヒアドキュメントの EOF マークは 1行単位で評価されますから EOFマークには途中のデータ行に出現しない文字 列を選ばなければなりません。
JAL:(03)5489-1111 JAS:(03)3438-1155 ANA:(03)3272-1212 ... KLM:(03)3216-0771 |
alias エリアス名=コマンド
各コマンドの最初の単語をエリアスリストと比較し、 一致するものがあれば、その定義に置き換える。 これを置き換えがなくなるまで繰り返す。 この機能により、再帰エリアスが可能です。
では ll $(whence cc) ~fred/.*$($$%1000) をどう処理するかみてみましょう。
条件は、以下のとおりです。
コマンドの遷移 | 解説 |
---|---|
ll $(whence cc) ~fred/.*$(($$ % 1000)) | alias ll="ls -l" 入力を単語に分解する |
ls -l $(whence cc) ~fred/.*$(($$ % 1000)) | エリアスを置換する |
ls -l $(whence cc) /home/fred/.*$(($$ % 1000)) | ~fred を /home/fred に置換 |
ls -l $(whence cc) /home/fred/.*$((2537 % 1000)) | $$ を 2537 に置換 |
ls -l /usr/bin/cc /home/fred/.*$((2537 % 1000)) | whence cc にコマンド置換する |
ls -l /usr/bin/cc /home/fred/.*537 | 2537 % 1000 を評価する |
ls -l /usr/bin/cc /home/fred/.*537 | ls -l をトークンに分ける |
ls -l /usr/bin/cc /home/fred/.hist537 | .*537 のワイルドカードをファイル名に置換 |
ls -l /usr/bin/cc /home/fred/.hist537 | ls コマンド有り |
ls -l /usr/bin/cc /home/fred/.hist537 | /usr/bin/ls を2つの引数で実行 |
記法 | 意 味 |
---|---|
< FILE | 標準入力として FILE から読みこむ |
> FILE | 標準出力として FILE に書きこむ |
>| FILE | noclobber を無視し、標準出力として FILE に書きこむ |
>> FILE | 標準出力として FILE に追加書きこみします |
<> FILE | 標準入力として読み書き用 FILE をオープンする |
ファイルディスクリプタ | |
---|---|
0 | 標準入力 |
1 | 標準出力 |
2 | 標準エラー出力 print -u2 "XXXXXX" |
入力リディレクション | |
[n]<word |
wordで表すファイルの内容が、nで表すファイルディスクリプタへの入力になる。 nが省略されると、0、つまり標準入力と見なされる。 |
[n]>[|]word
|
nで表すファイルディスクリプタへの出力が、wordで表すファイルに出力される。 |
[n]>>word |
nで表すファイルディスクリプタへの出力が、wordで表すファイルに出力される。 ファイルが存在するときは、そこに追加される。 |
<<[-]word | wordのパターンが現れるまで入力する。 |
&>word | 標準出力と標準エラー出力の両方をwordに出力する。 |
[n]<&word | |
[n]>&word |
nで表すファイルディスクリプタへの出力が、wordで表すファイルと合わせて出力される。 例: ls 2>&1 > dirlist -- lsコマンドのエラー出力が標準出力と一緒になり、それがdirlistに出力される。
|
[n]<>word | 入出力の両方にwordで表すファイルが使われる。 |
< | stdin |
> | stdout |
>foo 2>&1 | stdout and stderr |
>! | stdout (ignore noclobber) |
n>&m | n の出力を m に変更 |
n<&m | m の入力を n に変更 |
<&- | stdin クローズ |
>&- | stdout クローズ |
read文は標準入力から1行を読み込み、 引数として与えられたシェル変数リストに順次代入します。
read val-list
read の引数がシェル変数リストであれば IFSで区切られた語句をそれぞれに代入します。 もし、読み込んだ1行から分解した語句の数よりもシェル変数名リスト val-list に列記された数が少なければ、 あふれた語句は変数名リストの最後にまとめて代入されます。
read文の終了状態はEOFを検出しない限りゼロ(真)です。
また、ファイルから読む場合は、以下のようになります。
#------------------------------------------------------------------------- # taka 11344 11129 0 09:12:32 pts/2 0:00 grep -n ora_ # 1 2 3 4 5 6 7 8 # UID PID PPID C STIME TTY TIME CMD #------------------------------------------------------------------------- ps -ef | grep extproc > $FILES kill_extproc < $FILES function kill_extproc { while read UID PID DUM; do echo "For debug -- uid=$UID : pid=$PID" kill -9 $PID done
print で使えるエスケープ文字とオプションの一覧。
エスケープ | 文字 | 説明 |
---|---|---|
\a | ALERT | |
\b | BACKSPACE | |
\c | 最後の NEWLINE を出力しない | |
\f | FORMFEED | |
\n | NEWLINE | |
\r | ENTER | |
\t | TAB | |
\v | VERTICAL TAB | |
\0n | n は8進数値でその文字そのもの | |
\\ | BACKSLASH そのもの | |
オプション | 文字 | 機能 |
-n | 最後の NEWLINE を出力しない | |
-r | 上記エスケープ文字列を無視し、そのものを出力 | |
-p | パイプを通してコルーチンへ出力 | |
-s | ヒストリファイルへも出力 | |
-uN | N のファイルデスクリプタへ出力 |
シェルのオプションを設定/解除する機能だ けでなく、 1つのレコードからシェル変数 IFSで区切られたフィールド取り出し、 それを位置パラメータに代入する機能も持っています。
位置パラメータへの代入機能は setの引数として与えられた文字列(レコード) から IFSを区切としてそれぞれのフィールドを切り出し、$1〜$9 に 格納します。 この機能はユーザが位置パラメータに値を代入できる唯一の方法で、 シェルスクリプト内で多用されます。
setコマンドに引数を与えずに使うと、 ユーザの環境内に存在するすべての変数 が表示されます。
ユーザが実行している子プロセスの終了を待ち、終了状態を保存します。 書式は次の通りです。
引数 nには待ちたい子プロセスの識別番号(プロセスID)を指定します。 nを省略するとその時点で走っているすべての子プロセスの終了を待つことになります。 なお、このコマンド自体の終了状態は待っていたプロセスの終了状態 そのものです。
バックグランドで実行させた子プロセスの ID を知るにはシェル変数 $! を参照します。
trapはあるシグナルを受信した時になすべき仕事を指定するのに使い、 書式は次のようになっています。
trap command signal
commandは signal に指定されたシグナルリストのいずれかを受信したときに実行されるコマンドです。 signalを受信したときに実行するコマンドが2つ以上の場合は、 それらを引用符で囲まなければなりません。
signalは一連の番号で表され、 minixで使われる主なものは次のようなものです。
次のリストは trap文を使って一時作業ファイルを削除し、 スクリプトを終了させる例です。
prog=`basename $0` tmpfile="/tmp/$prog$$" trap 'rm -f $tmpfile;exit 1' 2 any-command > $tmpfile
コマンド | コマンド形式/意味 | |
---|---|---|
: | ○ | : [arguments]
引数を展開し、リディレクションを行うだけで何も実行しない。 |
. source | ○ | . filename [arguments]
source filename [arguments]
filenameで指定したファイルを実行する。 |
bg | ジョブ制御を参照。 | |
bind | bind [-m keymap] [-lpsvPSV] bind [-m keymap] [-q function] [-u function] [-r keyseq] bind [-m keymap] -f filename bind [-m keymap] keyseq:function-name readline(コマンド行入力編集機能)のキー割付状態を表示したり変更する。 -m キーマップの名前。 emacs、emacs-standard、emacs-meta、emacs-ctlx、vi、vi-command、vi-insert のどれか。 -l Readline機能の一覧表示 -p 機能とキー割り当ての一覧表示(再読込可能形式) -P 機能とキー割り当ての一覧表示 -v Readline変数名と値の一覧表示(再読込可能形式) -V Readline変数名と値の一覧表示 -s Readlineキーシーケンスのマクロへの割当一覧(再読込可能形式) -S Readlineキーシーケンスのマクロへの割当一覧 -f ファイルからキーの割当情報を読込む -q 名前付きファンクションのキー割当を表示 -u 名前付きファンクションへのキー割当を解除 -r キーシーケンスの割当を解除(2.02) -d 機能名とキー割当を一覧表示(再読込可能形式) |
|
builtin | builtin [shell-builtin [args]]
組込みコマンドを実行する。 |
|
break | ○ | break [n]
for、while、do until などのループ制御から抜ける。 |
cd | ○ | cd [-LP] [directory]
指定したディレクトリに移動する。 |
command | command [-p] command [arg ...]
外部コマンドや組込みコマンドと同名のシェル関数が定義されている場合、
そのままコマンドを入力するとシェル関数が実行されるが、
commandを使うとシェル関数を実行せずに組込みコマンドや外部コマンドを実行する。 commandの内容を表示する。 |
|
continue | ○ | continue [n]
ループ制御の先頭に戻り、ループを継続する。 |
declare |
declare [-afFrxi] [name[=value]] typeset [-afFrxi] [name[=value]]
シェル変数やBash変数を宣言したり、値を与える。 シェル変数やBash変数の値を表示する。 |
|
disown | ジョブ制御を参照。 | |
echo | echo [-neE][arg ...]
引数で指定した値を標準出力に出力する。 |
|
enable | enable [-n] [-f filename] [-ds] [name ...]
組込みコマンドを無効/有効にする。 有効な組み込みコマンドを表示する。 |
|
eval | ○ | eval [arg1 arg2 ...]
arg1、arg2...を結合し、それを一つのコマンドと引数として実行する。 |
exec | ○ | exec [[-] command [arguments]]
exec [-cl] [-a name] [command [arguments]](2.02)
commandがシェルと置き換わる。argumentsはcommandへの引数。 |
exit | ○ | exit [n]
Bashを終了する。ログインシェル中で実行すると、 シェルの終了と共にログアウトする。 |
export | ○ | export [-nf] [name[=word]] ...
nameのパラメータを環境変数にエクスポートする。 エクスポートしたnameを一覧表示する。 |
fc | 履歴機能を参照。 | |
fg | ジョブ制御を参照。 | |
getopts | ○ | getopts optstring name [arg]
シェルスクリプトでポジショナルパラメータを扱う。 |
hash | ○ | hash
シェルの一時記憶に登録されたコマンドを表示する。 hash [-r] [-p filename] [name] シェルの一時記憶にコマンドを登録する。 |
help | help [pattern]
Bashの組込みコマンドの説明を表示する。 |
|
history | 履歴機能を参照。 | |
jobs | ジョブ制御を参照。 | |
kill | ジョブ制御を参照。 | |
let |
let expression [expression]
expressionの式を評価して、その結果が0ならfalse(実際の値は1)を返し、 0以外ならtrue(実際の値は0)を返す。 |
|
local |
local name[=value]
シェル関数の中だけで有効な変数を定義する。 |
|
logout |
logout [n]
ログアウトする。 |
|
printf |
printf format [arguments]
formatで指定して形式でargumentsの内容を標準出力に出力する。 |
|
pwd | ○ | pwd [-LP]
現在のディレクトリを表示する。 |
read | read [-r][name ...]
read [-a aname] [-p prompt] [-er] [name ...]
1行分の文字列を入力させ、それをnameのシェル変数に代入する。 |
|
readonly | ○ | readonly [-p]
読込み専用となっている名前を一覧表示する。 nameを読込み専用にする。 |
return | ○ | return [n]
nを戻り値として、シェル関数から抜ける。 |
set | setコマンドを参照。 | |
shift | ○ | shift [n]
ポジショナルパラメータをn個分シフトする。$n+1...$#が$1...$#-n+1となる。 |
shopt |
shopt [-pqsu] [-o] [optname ...]
シェルの動作を制御するオプショナル変数の値をセットする。 |
|
source | .と同じ。 | |
suspend | ジョブ制御を参照。 | |
test / [ ] | ○ | 条件式を評価する。 評価した結果は、0がtrue、それ以外がfalseとなる。 |
times | ○ |
time command [arg...]
コマンドの実行時間を計測する。 |
trap | ○ | trap [arg] [sigspec ...]
sigspecのシグナルを受け取ったときに、 argで指定したコマンドを実行するように登録する。 trap -ptrapによってシグナルに対応つけられたコマンドを表示する。
trap -l |
type |
type [-all] [-type | -path] [name ...]
nameのコマンドタイプを表示する。 |
|
typeset | declareと同じ | |
ulimit |
ulimit [-acdflmnpstuvSH] [limit]
シェルから起動されるプロセスが利用できるシステムリソース(メモリなど)の制限を表示したり、設定する。 |
|
umask | ○ | umask [mode]
ファイルを作成するときのモードをセットする際のマスク値を設定する。 umask [-p] [-S]
-p コマンドとして再入力可能な形式でマスク値を表示する。 |
unset | ○ | unset [-fv] [name]
nameを削除する。 |
wait | ジョブ制御を参照。 | |
エイリアス | ||
alias | alias [name[=value] ...]
エイリアスを定義する alias datecmd='date +"%y/%m/%d %H:%M:%S"' |
|
unalias |
unalias name ...
nameのエイリアスを削除する unalias -aエイリアスを全部削除する |
|
ディレクトリスタック | ||
dirs | dirs [+N | -N] [-lvp]
ディレクトリスタックの内容を表示する。 ディレクトリスタックの内容をクリアする。 |
|
popd | popd [+N | -N] [-n]
ディレクトリスタックからエントリを取り出し、そのディレクトリに移動する。 |
|
pushd | pushd dir
カレントディレクトリを移動し、元のディレクトリをディレクトリスタックに追加する。 pushd [+N | -N] [-n]ディレクトリスタック中のエントリの順番を変更し、スタックの一番上のディレクトリに移動する。 |
option | 意 味 | debug |
---|---|---|
-f | ファイル名の生成を抑止します | |
-n | コマンドの構文解析はするが、実行はしない | |
-v | 履歴展開後のコマンド入力をエコーする | * |
-x | 変数展開後、実行前のコマンドをエコーする | * |
-p | $HOME/.profile ファイルの処理を抑止して、 ENV ファイルの代わりにファイル /etc/suid_profile を使用します。このモード は、エフェクティブ uid (gid) が実際の uid (gid) と異なるときには必ずオンになります。 このモードをオフにすると、エフェクティブ uid とエフェクティブ gid には実際の uid と gid が設定されます。 |
オプション | 例 |
---|---|
変数名=値;export 変数名 | LANG=ja;export LANG |
オプション | ファイル名 |
---|---|
ログイン時 | .profile |
オプション | ファイル名 |
---|---|
-n | 検査するだけで、実行はしない |
-v | おしゃべりモード:実行を echo する |
-x | 展開を echo する |
-u | 値が格納されていないシェル変数を参照すると unset variable のエラーメッセージが表示され停止します。 |
typeset -ft fnm | 指定した関数のトレースがオンとなる |
問題 | 対処法 |
---|---|
スクリプトからスクリプトを実行したとき 入出力が解決できないと以下のエラーになる |
【エラーメッセージ】 stty: : デバイスへの ioctl が正しくありません。 【対処法】 ksh スクリプト名 > /dev/null 2>&1 |
スクリプトで ls のエラーをエラーとしたくない | 【対処法】 set nonomatch |
項目 | コ ー ド | 結果 |
---|---|---|
引数配列 t_arg |
#!/bin/ksh echo 'value of $@ ...' for ARG in "$@" do echo $ARG done echo 'value of $* ...' for ARG in "$*" do echo $ARG done echo 'value of $# ...' $# echo 'value of $0 ...' $0 echo 'value of $1 ...' $1 echo 'value of $2 ...' $2 exit 0 | > t_arg aaa bbb ccc value of $@ ... aaa bbb ccc value of $* ... aaa bbb ccc value of $# ... 3 value of $0 ... t_arg value of $1 ... aaa value of $2 ... bbb |
シェル変数を表示 t_env |
#!/bin/ksh set -A ENV_LST SID BASE HOME for TAIL in ${ENV_LST[*]} do NAME="ORACLE_${TAIL}" echo `env|grep $NAME` done exit 0 | ozzy-33 06/20 4:22pm] t_env ORACLE_SID=ora816 ORACLE_BASE=/home12/ora816/app/oracle ORACLE_HOME=/home12/ora816/app/oracle/product/8.1.6 |
配列 t_ary |
#!/bin/ksh set -A filename $(ls $@) print ${filename[*]} print ${#filename[*]} exit 0 |
> t_ary RESULT apache argall bbb chk_file_date 5 |
配列 t_ary1 |
#!/bin/ksh set -A ary a0 a1 a2 a3 a4 let i=0 while [ $i != ${#ary[*]} ] do print ${ary[$i]} let i=i+1 done exit 0 |
> t_ary1 a0 a1 a2 a3 a4 |
trap t_trap |
#!/bin/ksh function loop { while true; do sleep 60 done } print "If you hit control_C, then exit" trap date INT TERM loop print " exiting ....." exit 0 |
> t_trap If you hit control_C, then exit ^C2001年11月14日 (水) 08時59分07秒 JST exiting ..... |
getopt anaopt |
#!/bin/ksh while getopts ":ab:c" opt; do case $opt in a) print "a specified" ;; b) print "b specified $OPTARG" ;; c) print "c specified" ;; *) print "Usage : anaopt [-a] [-b barg] [-c] args" ;; esac done shift $(($OPTIND -1)) print "$@" exit 0 |
> anaopt -a -b BBB -c ZZZZ a specified b specified BBB c specified ZZZZ |
#!/bin/ksh ACCT=system/manager PRG="sqlplus $ACCT" DOLL='$' DUBL='"' SQL1="set pagesize 1000" SQL2="select s.sid, s.PROGRAM,s.LOGON_TIME \"START\", \ s.STATUS, s.PROCESS, s.SERVER, t.value \ from v\$session s, v\$sesstat t, v\$statname n, \ v\$process p \ where s.paddr = p.addr(+) \ and s.sid = t.sid and t.STATISTIC# = n.STATISTIC# \ and n.name = 'execute count' \ order by logon_time, p.pid;" $PRG << SQL_STMT $SQL1 $SQL2 SQL_STMT
$$ は自スクリプトの PID ですので、これを付ければ、 ユニークなファイル名を取得できます。
TMP_FILE=/tmp/out.$$
例えば stderr をファイル1に stdout をファイル2にするには、
find . -name core 1> /tmp/file2 2> /tmp/file1
/dev/null に出力すると、全出力はなくなります。
find . -name core > /dev/null 2>&1
定義の後ろにある空白は、引数と置き換わります。
ozzy-21 06/14 9:50am] alias lsl='ls -l ' ozzy-22 06/14 9:54am] lsl csh drwxr-xr-x 2 taka dba 512 4月 12日 2001年 DirList drwxr-xr-x 2 taka dba 512 12月 27日 2001年 FAQ drwxr-xr-x 2 taka dba 1536 4月 1日 2003年 bak drwxr-xr-x 2 taka dba 512 12月 11日 2001年 html drwxr-xr-x 2 taka dba 512 10月 26日 2001年 tmp
exit 式 を実行することで、$? に式値が返ります。
$ t_fnd core $ echo $? 0 $ t_fnd Usage : t_fnd FIND_FILE_NAME $ echo $? 1
$0 はフルパスで設定されるからです。
本名 | 著者 | 出版社 | 値段 |
---|---|---|---|
Korn Shell 入門 | Bill Rosenblatt | トムソン・パブリッシング | 4500 |
入門 Korn シェル | Bill Rosenblatt | オライリー | 3200 |