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:
- blue
- red
- green
|
文件测试
|
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.
- 如果数组中的元素号等于变量值,则到达了数据末端.
- 结束循环.
posted on 2008-06-30 10:25
一叶笑天 阅读(412)
评论(0) 编辑 收藏 所属分类:
Shell技术