基本语法
”;”作为语句的结束,因此可以将多个command写在一行。
 print -n "Name: "; read name; print ""
“\” 可将第二行command与第一行连接起来,若command太长,可通过这种方式写在多行上。
 grep filename | sort -u | awk '{print $4}' | \
 uniq -c >> /longpath/file
Variables
Arrays
arrname[1]=4  To fill in 
print ${arraname[1]}  To print out 
${arrname[*]}  Get all elements 
${#arrname[*]}  Get the number of elements
Branching
if
 if [[ $value -eq 7 ]]   
 then   
    print "$value is 7"   
 fi
if … else
 if [[ $name = "John" ]]
 then
    print "Your welcome, ${name}."
 else
    print "Good bye, ${name}!"
 fi
if … elif … else
 if [[ $name = "John" ]]
 then
    print "Your welcome, ${name}."
 elif [[ $name = "Hanna" ]]
 then
    print "Hello, ${name}, who are you?"
 else
    print "Good bye, ${name}!"
 fi
case
 case $var in
   john|fred)  print $invitation;;
   martin)  print $declination;;
   *)  print "Wrong name…";;
 esac
Looping
while
 while [[ $count -gt 0 ]];do
    print "\$count is $count"
    (( count -= 1 ))
 done
until
 until [[ $answer = "yes" ]];do
    print -n "Please enter \"yes\": "
    read answer
    print ""
 done
for
 for foo in $(ls);do
    if [[ -d $foo ]];then
       print "$foo is a directory"
    else
       print "$foo is not a directory"
    fi
 done
continue
 while read line
 do
   if [[ $line = *.gz ]];then
      continue
   else
      print $line
   fi
 done
break
 while read line;do
     if [[ $line = *!(.c) ]];then
        break
     else
        print $line
     fi
 done
Comparisons
字符比较:”=”用于相等,”!=”用于不等。 
数字比较:”-eq”用于相等,”-ne”用于不等,”-gt”用于大于,”-lt”用于小于。 
与或比较:”&&”表示与,”||”表示或。
变量操作
${name##*/}:用于从包含路径的变量中取出文件名。  
${name%/*}:用于从包含路径的变量中取出路径。  
dirname:用于获取文件的路径,不包含文件名。如:dirname $0 
${foo:-4}:如果foo不存在,则返回4,但foo仍然没有值。  
${foo:=4}:如果foo不存在,则附值4给foo。  
${foo:+1}:如果foo有值,则返回1,但foo的值不改变。  
${foo:?”foo not set!”}:如果foo不存在,则退出程序并显示”foo not set!”。 
${foo:startOffset}:从startOffset处开始截取字符串foo到末尾。 
${foo:startOffset:endOffset}:截取字符串foo从startOffset到endOffset。
特殊变量
$#:命令行参数的个数。 
$1, ….$n:单个命令行参数。 
$*:所有的命令行参数。  
$0:当前script的名字,如果是从另外一个目录执行的,还将包含路径信息。  
$?:上个command执行结果的状态。 
$$:当前script的pid。  
$!:最后一个后台执行的程序的pid。 
shift:删除第一个命令行参数。
数据重定向
command > file:将输出写到新文件或覆盖已存在的文件。 
command >> file:将输出添加在已存在文件中。 
command 2> file:将错误输出重定向到文件。 
command 2>/dev/null:丢弃错误信息。  
command 2>&1:将错误输出重定向到正常输出。  
command < file:从标准输入读取文件。  
command < infile > outfile:组合输入和输出重定向。
Read Input from User and from Files
read var:读取用户输入的变量。如:
 print -n "Enter your favorite haircolor: ";read var; print ""。
按行读取文件的内容到变量:
 { while read myeline;do
      # process $myline
 done } < filename
Calculation
简单的计算可通过 “let” 或 (( … ))。如:(( a+=1 )) 或 let a+=1。
typeset用法
typeset用于设置变量属性,如大小写、宽度、左右对齐等都可以用typeset来控制, 当用typeset改变一个变量的属性时,这种改变是永久的。
选项:
-u:将一个变量的字符变成大写。  
-l:将一个变量的字符变成小写。  
-L
-R
-Z
-i:强制变量为一个整数。 
-r:设置一个只读变量。
文件状态测试
-b filename:当filename 存在并且是块文件时返回真。 
-c filename:当filename 存在并且是字符文件时返回真。 
-d pathname:当pathname 存在并且是一个目录时返回真。 
-e pathname:当由pathname 指定的文件或目录存在时返回真。 
-f filename:当filename 存在并且是正规文件时返回真。 
-h filename:当filename 存在并且是符号链接文件时返回真。 
-r pathname:当由pathname 指定的文件或目录存在并且可读时返回真。 
-s filename:当filename 存在并且文件大小大于0 时返回真。 
-w pathname:当由pathname 指定的文件或目录存在并且可写时返回真。 
-x pathname:当由pathname 指定的文件或目录存在并且可执行时返回真。 
-O pathname:当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真。 
-G pathname:当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真。 
file1 -nt file2:file1 比file2 新时返回真。 
file1 -ot file2:file1 比file2 旧时返回真。
字符串测试
-z string:字符串string 为空串(长度为0)时返回真。 
-n string:字符串string 为非空串时返回真。
Resources
Korn Shell Programming:http://www.bo.infn.it/alice/alice-doc/mll-doc/impgde/node15.html 
Learning the Korn Shell: http://docstore.mik.ua/orelly/unix/ksh/