ksh

概要 関数
演算子 算術演算子 算術関係演算子 算術テスト演算子
文字列検査演算子 ファイル検査演算子 パターン適合演算子
変数 変数 配列 書式指定変数 (*)
定義済シェル変数 シェル引数
文字 メタ文字 引用符 コマンド起動用特殊文字
文字列定数

機能 履歴機能 ジョブ 制御 ヒアドキュメント
エリアス
コマンド行処理
入出力 入出力 入出力切り替え read
print

内部コマンド set wait trap
組込コマンド 組込コマンド

環境 オプション 環境変数 環境ファイル
その他 デバッグ エラー対処法
FAQ 練習問題

ksh と sh はほとんど同じですので、 sh でも以下の記述は参考になります。
一部の sh の違いは、青文字で記載し、 上記インデックスに (*) があるものは、sh では使えません。

概要

ksh はコマンドインタープリタであり、かつプログラム言語です。 ksh にはいくつかの組み込みコマンドがあります。

ksh はプログラム言語として、 いくつかの構文とそこで使う変数から構成されています。 ksh で書かれたプログラムは、シェルスクリプトとよばれ、 実行権限を付与すると、そのまま実行することができます。 簡単な特徴を以下に列挙します。

  1. 変数名は英字ではじまり、英数と _ を続けられます。 字句解析時、最長語句を取り出そうとするので、明示的に分離したい場合は、 {} で囲みます。 また変数を参照する場合は変数名の前に $ をつけます。

    変数でも定数定義で使う場合はすべてを大文字で、 変数として使う場合は小文字で、名前を付けましょう。 変数は配列でもよく、その添え字は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

  2. 変数に値を代入する場合、 = の前後に空白を入れてはいけません。
  3. 基本的に数値も文字扱いです。計算に使うときは、let aaa=0 のようにします。
  4. if 文などの [[ ]] の終わりには、";" を入れることで継続して書けます。
  5. ksh は csh よりも機能が多く、 実現できないことは、ほとんどないと言えるでしょう。

なお、 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 ."

while true; do sleep 60 done
MAX_LOOP=100 let n=0 while (( $n < $MAX_LOOP )) do : let n=$n+1 done
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

再帰関数のときは変数は全て typset すること

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




書式指定変数: sh ではこの機能はありません

関数内にローカルな変数を定義するには、typeset を使います。
typeset だけを入れると、現在定義されている変数をすべてリストします。

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言語の文字列定数と同じように次の文字置き換えが行われる。
\a  警告音
\b バックスペース
\e エスケープ文字
\f フォームフィード
\n 改行
\r キャリッジリターン
\t 水平タブ
\v 垂直タブ
\\ \を意味する
\nnn 文字コードが8進数でnnnという値を持つ文字
\xnn 文字コードが16進数でnnという値を持つ文字




機能

履歴機能

コマンド コマンド形式/意味
組込みコマンド
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 &

コマンドの末尾に&をタイプすると、バックグラウンドで実行する。実行すると
[1] 23645
というように表示する。[1]はジョブ番号、その後の番号はプロセスID。

サスペンド文字
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] ...

プロセスにシグナルを送る。
シグナルを送ることでプロセスを再起動したり、停止させたりする。
-n 送るシグナルを番号で指定する
-s 送るシグナルを名前で指定する

kill -l [signum]

シグナルを一覧表示する。シグナルの詳細は"man 7 signal"で参照。

suspend
suspend [-f]

実行中のシェルを中断する。
-f -f がないとログインシェルは中断しないが、
-f があるとログインシェルでも中断する。

wait
wait [jobspec|pid]

ジョブの終了を待つ。

stty
tostop   端末出力の抑制
-tostop  端末出力の抑制解除 

jobspecの指定方法

%番号 ジョブ番号が番号に一致するジョブを指す
%string stringで始まるジョブを指す
%?string stringを含むジョブを指す
%% 直前に最後に中断状態に移行したジョブ
%+ 直前に最後に中断状態に移行したジョブ
%- %+の一つ前に中断したジョブ




ヒアドキュメント(here document)

シェルは << を見つけると、それに続く文字列 END-OF-FILE を EOF マークとして覚えます。 そして、その直後の行から次の EOF マークの直前の行までを コマンド grep への入力に結合します。

ヒアドキュメントの EOF マークは 1行単位で評価されますから EOFマークには途中のデータ行に出現しない文字 列を選ばなければなりません。

grep $1 << END-OF-FILE
JAL:(03)5489-1111 
JAS:(03)3438-1155 
ANA:(03)3272-1212 
      ... 
KLM:(03)3216-0771 
END-OF-FILE




エリアス

alias エリアス名=コマンド

各コマンドの最初の単語をエリアスリストと比較し、 一致するものがあれば、その定義に置き換える。 これを置き換えがなくなるまで繰り返す。 この機能により、再帰エリアスが可能です。




コマンド行処理

では ll $(whence cc) ~fred/.*$($$%1000) をどう処理するかみてみましょう。

条件は、以下のとおりです。

  1. fred ディレクトリに .hist537 というファイルがあります。
  2. $$ は 2537 です。(プロセス番号です)

コマンドの遷移 解説
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が省略されると、1、つまり標準出力と見なされる。
noclobberオプションが指定されていると既存ファイルへの上書きが禁止されるが、 >|はそれを無視して強制的に上書きする。

[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

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

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 のファイルデスクリプタへ出力




内部コマンド

set

シェルのオプションを設定/解除する機能だ けでなく、 1つのレコードからシェル変数 IFSで区切られたフィールド取り出し、 それを位置パラメータに代入する機能も持っています。

位置パラメータへの代入機能は setの引数として与えられた文字列(レコード) から IFSを区切としてそれぞれのフィールドを切り出し、$1〜$9 に 格納します。 この機能はユーザが位置パラメータに値を代入できる唯一の方法で、 シェルスクリプト内で多用されます。

$ set `date` ; echo $1

setコマンドに引数を与えずに使うと、 ユーザの環境内に存在するすべての変数 が表示されます。




wait

ユーザが実行している子プロセスの終了を待ち、終了状態を保存します。 書式は次の通りです。

wait n

引数 nには待ちたい子プロセスの識別番号(プロセスID)を指定します。 nを省略するとその時点で走っているすべての子プロセスの終了を待つことになります。 なお、このコマンド自体の終了状態は待っていたプロセスの終了状態 そのものです。

バックグランドで実行させた子プロセスの ID を知るにはシェル変数 $! を参照します。




trap

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 




組込コマンド

組込コマンド

コマンド bsh コマンド形式/意味
: : [arguments]

引数を展開し、リディレクションを行うだけで何も実行しない。

. source . filename [arguments] source filename [arguments]

filenameで指定したファイルを実行する。
単に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 などのループ制御から抜ける。
nが指定されている場合は、n段外側のループまで抜ける。

cd cd [-LP] [directory]

指定したディレクトリに移動する。
directoryが指定されない場合はホームディレクトリに移動する。
シェル変数CDPATHが定義されている場合は、 そこから移動先のディレクトリを探す。
-L 移動先がシンボリックリンクでも、そこに移動する。これがデフォルトの動作。
-P 移動先がシンボリックリンクの場合には、そこには移動しない。

command   command [-p] command [arg ...]

外部コマンドや組込みコマンドと同名のシェル関数が定義されている場合、 そのままコマンドを入力するとシェル関数が実行されるが、 commandを使うとシェル関数を実行せずに組込みコマンドや外部コマンドを実行する。
-p デフォルトの$PATHを使うcommand [-Vv] command [arg ...]

commandの内容を表示する。
-V コマンドの内容を表示する
-v 外部コマンドの場合、コマンドファイルのパス名を表示する

continue continue [n]

ループ制御の先頭に戻り、ループを継続する。
nが指定されている場合は、n段外側のループの先頭に戻る。

declare   declare [-afFrxi] [name[=value]] typeset [-afFrxi] [name[=value]]

シェル変数やBash変数を宣言したり、値を与える。
-a nameは配列
-f nameは関数名
-F 関数名と属性だけ表示する
-i nameは整数
-r nameは読込のみ
-x nameを環境変数によってエキスポートし、後続のコマンドから参照できるようにする declare [-p] [name]

シェル変数やBash変数の値を表示する。
-p nameの値と属性を表示する(2.02)

disown   ジョブ制御を参照。
echo   echo [-neE][arg ...]

引数で指定した値を標準出力に出力する。
-n 末尾に改行コードを出力しない
-e エスケープ文字('\')の置き換えを行う
-E エスケープ文字('\')の置き換えを行わない

enable   enable [-n] [-f filename] [-ds] [name ...]

組込みコマンドを無効/有効にする。
-n nameで指定した組込みコマンドを無効にする
-f 組込みコマンドをファイルから読込む
-d -fオプションで読込んだ組込みコマンドを無効にする
-s POSIXのspecial builtinとして機能するenable [-p] [-f filename] [-a] [name ...]

有効な組み込みコマンドを表示する。
-a 無効なものも含めて組込みコマンドを全部表示する。
-all -aと同じ(1.14)
-p 有効な組込みコマンドを一覧表示する

eval eval [arg1 arg2 ...]

arg1、arg2...を結合し、それを一つのコマンドと引数として実行する。

exec exec [[-] command [arguments]] exec [-cl] [-a name] [command [arguments]](2.02)

commandがシェルと置き換わる。argumentsはcommandへの引数。
-c commandが動作する環境変数に何もセットしない。
-l 0番目の引数として'-'を渡し、commandをログインシェルとして動作させる。
-a nameを0番目の引数としてcommandに渡す。

exit exit [n]

Bashを終了する。ログインシェル中で実行すると、 シェルの終了と共にログアウトする。

export export [-nf] [name[=word]] ...

nameのパラメータを環境変数にエクスポートする。
-n エクスポートを取りやめにする
-f nameは関数名

export -p

エクスポートしたnameを一覧表示する。

fc   履歴機能を参照。
fg   ジョブ制御を参照。
getopts getopts optstring name [arg]

シェルスクリプトでポジショナルパラメータを扱う。

hash hash

シェルの一時記憶に登録されたコマンドを表示する。

hash [-r] [-p filename] [name]

シェルの一時記憶にコマンドを登録する。
-r 一時記憶をクリアする
-p 通常、コマンドは$PATH中のディレクトリを検索するが、 -pがあると検索せず、filenameがnameの場所となる。
name 一時記憶に登録するコマンドの名前

help   help [pattern]

Bashの組込みコマンドの説明を表示する。
pattern コマンドの先頭部分がpatternと一致するものの説明を表示する。

history   履歴機能を参照。
jobs   ジョブ制御を参照。
kill   ジョブ制御を参照。
let   let expression [expression]

expressionの式を評価して、その結果が0ならfalse(実際の値は1)を返し、 0以外ならtrue(実際の値は0)を返す。

local   local name[=value]

シェル関数の中だけで有効な変数を定義する。

logout   logout [n]

ログアウトする。
n シェルから抜けるときに親シェルに渡す戻り値。

printf   printf format [arguments]

formatで指定して形式でargumentsの内容を標準出力に出力する。

pwd pwd [-LP]

現在のディレクトリを表示する。
-L 表示するパスにシンボリックリンクを含む。これがデフォルトの動作。
-P 表示するパスにシンボリックリンクを含まない

read   read [-r][name ...] read [-a aname] [-p prompt] [-er] [name ...]

1行分の文字列を入力させ、それをnameのシェル変数に代入する。
-p 文字を入力前にプロンプトを表示する。
-a 配列anameのインデクス値を指定する。
-r '\'を特別扱いせず、入力文字とみなす。
-e 入力時にreadline(コマンド入力編集機能)を使用する。

readonly readonly [-p]

読込み専用となっている名前を一覧表示する。
-p 引数がない場合と同じ動作。

readonly [-af] name ...

nameを読込み専用にする。
-a nameを配列と見なす
-f 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 -p
trapによってシグナルに対応つけられたコマンドを表示する。

trap -l
シグナルの種類を一覧表示する。シグナルの詳細は"man 7 signal"で参照。

type   type [-all] [-type | -path] [name ...]

nameのコマンドタイプを表示する。
-a,-all 該当するものをすべて表示する。
-t,-type タイプを表すキーワード('alias'、'keyword'、'function'、'builtin'、'file'のどれか)を表示する。
-p,-path nameが外部コマンドの場合はパス名を表示する。

typeset   declareと同じ
ulimit   ulimit [-acdflmnpstuvSH] [limit]

シェルから起動されるプロセスが利用できるシステムリソース(メモリなど)の制限を表示したり、設定する。
limit limitを省略すると設定値を表示し、limitを与えるとその値を設定する。
-S ソフトウェア上の制限値
-H ハードウェア上の制限値
-a すべてのリソースに関する設定
-c コアのファイルサイズ
-d プロセスのデータセグメントのサイズ
-f シェルで作成するファイルの最大サイズ
-l ロック可能なメモリのサイズ(2.02)
-m 常駐セットのサイズ
-n オープンできるファイルディスクリプタの数
-p パイプの最大バッファサイズ
-s 最大スタックサイズ
-t CPUタイムの合計値(秒)
-u シングルユーザで使用可能なプロセスの数
-v プロセスで使用可能な仮想メモリのサイズ

umask umask [mode]

ファイルを作成するときのモードをセットする際のマスク値を設定する。

umask [-p] [-S]
現時点でのマスク値を表示する。

-p コマンドとして再入力可能な形式でマスク値を表示する。
-S シンボリック形式でマスク値を表示する。

unset unset [-fv] [name]

nameを削除する。
-f nameを関数名と見なす
-v 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]

ディレクトリスタックの内容を表示する。
+N dirsの表示の左からN番目(スタックの上からN番目)のエントリを表示する。
-N dirsの表示の右からN番目(スタックの下からN番目)のエントリを表示する。
-l ~などを展開した長い形式で表示する。
-p ひとつのエントリを1行で表示する。
-v -pに加えて、スタック中の位置も表示する。dirs -c

ディレクトリスタックの内容をクリアする。

popd   popd [+N | -N] [-n]

ディレクトリスタックからエントリを取り出し、そのディレクトリに移動する。
+N dirsの表示の左からN番目(スタックの上からN番目)のエントリを取り出して、そこに移動する。
-N dirsの表示の右からN番目(スタックの下からN番目)のエントリを取り出して、そこに移動する。
-n スタックからエントリを取り出して削除するだけで、カレントディレクトリを移動しない。

pushd   pushd dir

カレントディレクトリを移動し、元のディレクトリをディレクトリスタックに追加する。

pushd [+N | -N] [-n]

ディレクトリスタック中のエントリの順番を変更し、スタックの一番上のディレクトリに移動する。
+N dirsの表示の左からN番目(スタックの上からN番目)以降エントリをスタックの先頭部分に移す。
-N dirsの表示の右から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




注意すべき項目

  1. パラメータが必要な場合は、必ずパラメータの有無をチェックし、 必要なメッセージを出力しましょう。(使用法)
  2. 終了コードを必ず設定しましょう。
  3. 複雑なスクリプトの場合は、機能、引数、 エラーコードなどのコメントを書きましょう。

ksh スクリプト例

  1. 引数配列
  2. 配列
  3. 配列
  4. trap
  5. getopt

項目コ   ー   ド 結果
引数配列

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




FAQ

  1. 文中に特殊文字を入れるには?
  2. 一時作業ファイル名をユニークにするには?
  3. stderr と stdout の出力を分けるには?
  4. 出力をなくすには?
  5. alias 定義に引数を渡すには?
  6. シェルスクリプトの戻り値を返すには?

  1. 文中に特殊文字を入れる方法は?

    #!/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
    

  2. 一時作業ファイル名をユニークにするには?

    $$ は自スクリプトの PID ですので、これを付ければ、 ユニークなファイル名を取得できます。

    TMP_FILE=/tmp/out.$$
    

  3. stderr と stdout の出力を分けるには?

    例えば stderr をファイル1に stdout をファイル2にするには、

    find . -name core 1> /tmp/file2 2> /tmp/file1
    

  4. 出力をなくすには?

    /dev/null に出力すると、全出力はなくなります。

    find . -name core > /dev/null 2>&1
    

  5. alias 定義に引数を渡すには?

    定義の後ろにある空白は、引数と置き換わります。

    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
    

  6. シェルスクリプトの戻り値を返すには?

    exit 式 を実行することで、$? に式値が返ります。

    $ t_fnd core
    $ echo $?
    0
    $ t_fnd
    Usage : t_fnd FIND_FILE_NAME
    $ echo $?
    1
    

  7. OUT=$0.log と設定すると、 そのログはスクリプトのあるディレクトリに書かれるのはなぜ?

    $0 はフルパスで設定されるからです。




練習問題

  1. sjis ディレクトリに sjis コードのファイルが複数あります。 これらを全て EUC に変換して euc ディレクトリに入れます。
    何回実行しても、正常に動作するようにしましょう。 solaris では日本語のコード変換ツールは、sjtoeuc(1) です。

  2. あるディレクトリに SQL.0 から SQL.20 があります。 これを SQL.1 から SQL.21 に変えてください。




【 関連項目 】

sh(1),ksh(1)

【 関連リンク 】

ksh 自習テキスト

【 参考書 】

本名 著者 出版社 値段
Korn Shell 入門 Bill Rosenblatt トムソン・パブリッシング 4500
入門 Korn シェル Bill Rosenblatt オライリー 3200