基本语法
”;”作为语句的结束,因此可以将多个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/