Chris's Blog

Keep Walking......

Korn Shell Script

基本语法

”;”作为语句的结束,因此可以将多个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:将变量变成一个左对齐的num长度的字符串,有些像字符串截取。
-R:将变量变成一个右对齐的num长度的字符串。
-Z:将变量变成一个空格填充,占num个字符位的字符串。
-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/

Comments