[转] 5. Bourne Shell及shell编程
echo "Backup";;
3) echo "Unload";;
*) echo "Sorry $CHOICE is not a valid choice
exit 1
esac
在上例中,*指默认匹配动作。此外,case模式中也可以使用逻辑操作,如下所示
:
pattern1 | pattern2 ) command
command ;;
这样可以将上面示例程序中允许用户输入数字或每一个大写字母。
case "$CHOICE" in
1|R) echo "Restore";;
2|B) echo "Backup";;
3|U) echo "Unload";;
*) echo "Sorry $CHOICE is not a valid choice
exit 1
esac
(5)循环控制
<1> while循环:
格式:
while command
do
command
command
command
...
done
例: 计算1到5的平方
#!/bin/sh
#
#Filename: square.sh
int=1
while [ $int -le 5 ]
do
sq=`expr $int * $int`
echo $sq
int=`expr $int + 1`
done
echo "Job completed"
$ sh square.sh
1
4
9
16
25
Job completed
<2> until循环结构:
格式:
until command
do
command
command
....
command
done
示例:使用until结构计算1-5的平方
#!/bin/sh
int=1
until [ $int -gt 5 ]
do
sq=`expr $int * $int`
echo $sq
int=`expr $int + 1`
done
echo "Job completed"
<3> 使用shift对不定长的参数进行处理
在以上的示例中我们总是假设命令行参数唯一或其个数固定,或者使用$*将整个命
令
行参数传递给shell script进行处理。对于参数个数不固定并且希望对每个命令参
数
进行单独处理时则需要shift命令。使用shift可以将命令行位置参数依次移动位置
,
即$2->$1, $3->$2. 在移位之前的第一个位置参数$1在移位后将不在存在。
示例如下:
#!/bin/sh
#
#Filename: shifter
until [ $# -eq 0 ]
do
echo "Argument is $1 and `expr $# - 1` argument(s) remain"
shift
done
$ shifter 1 2 3 4
Argument is 1 and 3 argument(s) remain
Argument is 2 and 2 argument(s) remain
Argument is 3 and 1 argument(s) remain
Argument is 4 and 0 argument(s) remain
$
使用shift时,每进行一次移位,$#减1,使用这一特性可以用until循环对每个参
数进行处理,如下示例中是一个求整数和的shell script:
#!/bin/sh
# sumints - a program to sum a series of integers
#
if [ $# -eq 0 ]
then
echo "Usage: sumints integer list"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo $sum
$ sh sumints 324 34 34 12 34
438
$
使用shift的另一个原因是Bourne Shell的位置参数变量为$1~$9, 因此通过位置变
量
只能访问前9个参数。但这并不等于在命令行上最多只能输入9个参数』
3) echo "Unload";;
*) echo "Sorry $CHOICE is not a valid choice
exit 1
esac
在上例中,*指默认匹配动作。此外,case模式中也可以使用逻辑操作,如下所示
:
pattern1 | pattern2 ) command
command ;;
这样可以将上面示例程序中允许用户输入数字或每一个大写字母。
case "$CHOICE" in
1|R) echo "Restore";;
2|B) echo "Backup";;
3|U) echo "Unload";;
*) echo "Sorry $CHOICE is not a valid choice
exit 1
esac
(5)循环控制
<1> while循环:
格式:
while command
do
command
command
command
...
done
例: 计算1到5的平方
#!/bin/sh
#
#Filename: square.sh
int=1
while [ $int -le 5 ]
do
sq=`expr $int * $int`
echo $sq
int=`expr $int + 1`
done
echo "Job completed"
$ sh square.sh
1
4
9
16
25
Job completed
<2> until循环结构:
格式:
until command
do
command
command
....
command
done
示例:使用until结构计算1-5的平方
#!/bin/sh
int=1
until [ $int -gt 5 ]
do
sq=`expr $int * $int`
echo $sq
int=`expr $int + 1`
done
echo "Job completed"
<3> 使用shift对不定长的参数进行处理
在以上的示例中我们总是假设命令行参数唯一或其个数固定,或者使用$*将整个命
令
行参数传递给shell script进行处理。对于参数个数不固定并且希望对每个命令参
数
进行单独处理时则需要shift命令。使用shift可以将命令行位置参数依次移动位置
,
即$2->$1, $3->$2. 在移位之前的第一个位置参数$1在移位后将不在存在。
示例如下:
#!/bin/sh
#
#Filename: shifter
until [ $# -eq 0 ]
do
echo "Argument is $1 and `expr $# - 1` argument(s) remain"
shift
done
$ shifter 1 2 3 4
Argument is 1 and 3 argument(s) remain
Argument is 2 and 2 argument(s) remain
Argument is 3 and 1 argument(s) remain
Argument is 4 and 0 argument(s) remain
$
使用shift时,每进行一次移位,$#减1,使用这一特性可以用until循环对每个参
数进行处理,如下示例中是一个求整数和的shell script:
#!/bin/sh
# sumints - a program to sum a series of integers
#
if [ $# -eq 0 ]
then
echo "Usage: sumints integer list"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo $sum
$ sh sumints 324 34 34 12 34
438
$
使用shift的另一个原因是Bourne Shell的位置参数变量为$1~$9, 因此通过位置变
量
只能访问前9个参数。但这并不等于在命令行上最多只能输入9个参数』
浙公网安备 33010602011771号