Korn Shell
Korn和Bash shells 非常相似.
Korn语法和结构:
Shbang行 |
"shbang" 是脚本起始行,告诉kernel那个shell解析. #!位于行头。例如 #!/bin/ksh |
|||||
注释 |
行注释用#符号.例如: # This program will test some files |
|||||
通配符 |
*,?, 和 [ ]用于文件名扩展.例如<, >, 2>, >>, 和 | 用于IO和重定向. 为了保证这些符号不被解析,这个字符要被引起来。 例如:rm *; ls ??; cat file[1-3]; echo "How are you?" |
|||||
输出显示 |
输出屏幕echo和print,例如: echo "Who are you?" print "How are you?" |
|||||
局部变量 |
局部变量作用于当前shell,shell结束时局部变量失效.例如 variable_name=value typeset variable_name=value name="John Doe" x=5 |
|||||
全局变量 |
全局变量也称为环境变量. 例如: export VARIABLE_NAME =value export PATH=/bin:/usr/bin:. |
|||||
从变量中提取值 |
使用$.例如: echo $variable_name echo $name echo $PATH |
|||||
读取用户输入 |
使用read。例如: |
|||||
read name?"What is your name?" |
The prompt is in quotes. After it is displayed, the read command waits for user input |
|||||
print -n "What is your name?" read name read name1 name2 ... |
||||||
参数 |
可以从命令行传入参数。位置参数用于从脚本中接收值。例如: At the command line: $ scriptname arg1 arg2 arg3 ... In a script: |
|||||
echo $1 $2 $ |
位置参数, $1 分配为 arg1, $2 is 分配为arg2, ... |
|||||
echo $* |
所有位置参数 |
|||||
echo $# |
位置参数号 |
|||||
数组 |
Bourne shell 利用位置参数创建字符列表.除位置参数外,Korn shell也支持数组语法,起始位置为0. Korn shell数组用set –A命令创建.例如 |
|||||
set apples pears peaches |
位置参数 |
|||||
print $1 $2 $3 |
$1 is apples, $2 is pears, $3 is peaches |
|||||
set -A array_name word1 word2 word3 ... set -A fruit apples pears plums |
Array |
|||||
print ${fruit[0]} |
Prints apple |
|||||
${fruit[1]} = oranges |
Assign a new value |
|||||
算术 |
Korn shell 支持整数算术.typeset i命令会声明一个整数类型变量. Integer算术能够在变量上完成。否则,(( )) 语法 (let command)用于算术操作。例如: |
|||||
typeset -i variable_name |
声明integer |
|||||
typeset -i num num=5+4 |
num is declared as an integer |
|||||
print $num |
Prints 9 |
|||||
(( n=5 + 5 )) |
The let command |
|||||
print $n |
Prints 10 |
|||||
命令替换 |
像C/TC shells 和Bourne shell,Korn shell提供一种新的语法,将命名放在()中,前面加$.例如: variable_name=`command` variable_name=$( command ) echo $variable_name echo "Today is `date`" echo "Today is $(date)" |
|||||
操作符 |
Korn shell使用内建的test命令操作符,类似于C 语言操作符.例如: |
|||||
相等性: |
比较性: |
|||||
= |
string, equal to |
> |
greater than |
|||
!= |
string, not equal to |
>= |
greater than, equal to |
|||
== |
number, equal to |
< |
less than |
|||
!= |
number, not equal to |
<= |
less than, equal to |
|||
逻辑性: |
||||||
&& |
and |
|||||
|| |
Or |
|||||
! |
Not |
|||||
条件语句 |
if 语句条件放在()。then关键字位于()后. If用fi结束. [[ ]] 用于模式匹配. [ ]用于兼容Bourne shell. Case命令是另外一种if/else.例如: |
|||||
The if construct is: if command then block of statements fi ---------------------------- if [[ string expression ]] then block of statements fi |
---------------------------- if (( numeric expression )) then block of statements fi |
|||||
The if/else construct is: if command then block of statements else block of statements fi -------------------------- if [[ expression ]] then block of statements else block of statements fi --------------------------- if (( numeric expression )) then block of statements else block of statements fi The case construct is: case variable_name in pattern1) statements ;; pattern2) statements ;; pattern3) ;; esac ------------------------- case "$color" in blue) echo $color is blue ;; green) echo $color is green ;; red|orange) echo $color is red or orange ;; esac |
The if/else/else if construct is: if command then block of statements elif command then block of statements elif command then block of statements else block of statements fi --------------------------- if [[ string expression ]] then block of statements elif [[ string expression ]] then block of statements elif [[ string expression ]] then block of statements else block of statements fi ---------------------------- if (( numeric expression )) then block of statements elif (( numeric expression )) then block of statements elif (( numeric expression )) then block of statements else block of statements fi |
|||||
循环 |
四种类型循环: while, until, for, 和 select. while循环 跟随do。 until循环。 for循环。 select loop is used to provide a prompt (PS3 variable) and a menu of numbered items from which the user inputs a selection The input will be stored in the special built-in REPLY variable. The select loop is normally used with the case command. 循环控制命令,例如: |
|||||
while command do block of statements done ---------------------------- while [[ string expression ]] do block of statements done --------------------------- while (( numeric expression )) do block of statements done until command do block of statements done ---------------------------- until [[ string expression ]] do block of statements done ---------------------------- until (( numeric expression )) do block of statements done |
for variable in word_list do block of statements done ----------------------------- for name in Tom Dick Harry do print "Hi $name" done select variable in word_list do block of statements done ---------------------------- PS3="Select an item from the menu" for item in blue red green echo $item done Shows menu:
|
|||||
文件测试 |
Korn shell使用test command来评估表达式,例如: |
|||||
-d |
File is a directory |
|||||
-a |
File exists and is not a directory |
|||||
–r |
Current user can read the file |
|||||
–s |
File is of nonzero size |
|||||
–w |
Current user can write to the file |
|||||
–x |
Current user can execute the file |
|||||
Example 2.5. #!/bin/sh 1 if [ –a file ] then echo file exists fi 2 if [ –d file ] then echo file is a directory fi 3 if [ -s file ] then echo file is not of zero length fi 4 if [ -r file -a -w file ] then echo file is readable and writable fi |
||||||
函数 |
函数容许定义一段shell,而且给这段代码给一个名字.有两种格式:一种来自于Bourne shell,另一种来自于Korn shell.例如: function_name() { block of code } function function_name { block of code } ------------------------- function lister { echo Your present working directory is `pwd` echo Your files are: ls } |
Korn Shell脚本:
例子
1 #!/bin/ksh
2 # The Party Program––Invitations to friends from the "guest" file
3 guestfile=~/shell/guests
4 if [[ ! –a "$guestfile" ]]
then
print "${guestfile##*/} non–existent"
exit 1
fi
5 export PLACE="Sarotini's"
6 (( Time=$(date +%H) + 1 ))
7 set -A foods cheese crackers shrimp drinks "hot dogs" sandwiches
8 typeset -i n=0
9 for person in $(< $guestfile)
do
10 if [[ $person = root ]]
then
continue
else
# Start of here document
11 mail –v –s "Party" $person <<- FINIS
Hi ${person}! Please join me at $PLACE for a party!
Meet me at $Time o'clock.
I'll bring the ice cream. Would you please bring
${foods[$n]} and anythin else you would like to eat? Let
me know if you can make it.
Hope to see you soon.
Your pal,
ellie@`hostname`
FINIS
12 n=n+1
13 if (( ${#foods[*]} == $n ))
then
14 set -A foods cheese crackers shrimp drinks "hot dogs"
sandwiches
fi
fi
15 done
print "Bye..."
解释:
- 让Kernal知道在运行Korn shell script.
- 注释
3. 变量guestfile被设置为文件的全路径名,叫做guests.
- 行读入
- 环境变量.
- the hour of the day指定给变量Time.
- 数组foods赋值,使用 set –A 命令.项开始索引0.
- typeset –i 命令创建integer值.
- For循环.
- 条件测试.
- The mail message is sent. The message body is contained in a here document.
- 变量n增加1.
- 如果数组中的元素号等于变量值,则到达了数据末端.
- 结束循环.