实验五Shell脚本程序编制实验
●编写一个Shell命令脚本程序的基本步骤如下:
●(1)编辑包含用户命令脚本程序的文本文件
●(2)添加Shell定义语句,使Linux操作系统可以知道用户使用哪一种Shell
●(3)编写Shell命令脚本程序内容
●(4)保存脚本程序并退出。用“chmod +x ”命令改变该脚本程序的存取权限和执行
权限,使其可以被适当的用户使用。
●(5)运用该命令脚本程序以进行测试
●(6)如有必要,可进行程序纠错。
●(7)如有必要,可把完整的命令脚本程序移动到相应位置
●(8)如有必要,可在path语句中加上此脚本的路径
练习:编写书本P107welcome Shell脚本程序
运行脚本程序的三种方法:
a.bash 脚本文件名
b.bash < 脚本文件名
c.chmod u(或g,o,a)+x 脚本文件名#为脚本添加执行权限
Shell定义的环境变量shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的shell环境变量有:
●HOME:用于保存注册目录的完全路径名。
●PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜
索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
●TERM:终端的类型。
●UID:当前用户的标识符,取值是由数字构成的字符串。
●PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
●PS1:主提示符,在特权用户下,缺省的主提示符是“#”,在普通用户下,缺省的
主提示符是“$”。
●PS2:在shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后
回车,或者当用户按回车键时shell判断出用户输入的命令没有结束时,显示这
个辅助提示符,提示用户继续输入命令的其余部分,缺省的辅助提示符是“>”。练习:使用echo显示上述环境变量内容
注意:PS1 提示符设定标记:
●\d 日期
●\H 完整主机名\h 主机名第一段
●\t 24小时时间\T 12小时时间
●\u 用户名
●\V Bash版本信息
●\w 完整的工作路径\W 最后一层目录名
●\# 下达的第几个命令
●\\$ 提示符(root $,普通用户#)
练习:输入以下命令,思考设置PS1环境变量的作用
PS1=?\u-\w(\#)\\$?
PS1=[\u@\h \W]\\$
定义变量格式:变量名=变量值
引用变量$变量名
只读变量readonly 变量名
export命令对已定义的变量进行输出,使变量可被子shell使用
位置参数位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔。
所有预定义变量都是由$符和另一个符号组成的,常用的shell预定义变量有:
●$#:位置参数的数量
●$*:所有位置参数的内容
●$?:命令执行后返回的状态
●$$:当前进程的进程号
●$!:后台运行的最后一个进程号
●$0:当前执行的进程名
练习
编写一个Shell脚本testenvv.sh如下,思考各位置参数的含义:
#!/bin/bash
echo …$#:? $#
echo …$*:? $*
echo …$?:? $?
echo …$$:? $$
echo …$!:? $!
echo …$0:? $0
echo …$1:? $1
保存后,执行该脚本,例如: bash testenvv.sh a b c
参数置换的变量
shell提供了参数置换能力以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下。
● a. 变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word
置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
● b. 变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变
量设置成word然后再用word替换参数的值。
●注意,位置参数不能用于这种方式,因为在shell程序中不能为位置参数赋值。
● c. 变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就
显示word并从shell中退出,如果省略了word,则显示标准信息。
●这种变量要求一定等于某一个参数的值,如果该参数没有设置,就显示一个信
息,然后退出,因此这种方式常用于出错指示。
● d. 变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。
所有这四种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。
练习:编写一个Shell脚本testpr.sh如下,思考各种参数置换的功能:
#! /bin/bash
v3=”3”#1
v4=”4”
echo ”v1:$v1 v2:$v2 v3:$v3 v4:$v4”
p1=${v1-“1”}
p2=${v2=”v2”}
p3=${v3?”no value in v3”}
p4=${v4+”r4”}
echo ”p1:$p1 p2:$p2 p3:$p3 p4:$p4”
试着删除标注"#1"的行,保存后运行,结果会有何不同?
expr命令求值(一般用于整数或字符串)
–参数应用规则:
*用空格隔开每个项;(每个项都是命令行参数)
*用\ (反斜杠) 放在shell 特定的字符前面;
*对包含空格和其他特殊字符的字符串要用引号括起来
练习:
(1)、计算字串长度
expr length “this is a test”
(2)、抓取字串
expr substr “this is a test” 3 5
(3)、获取第一个字符出现的位置
expr index “sarasara” a
(4)、整数运算
expr 14 % 9
expr 10 + 10
expr 1000 + 900
expr 30 / 3 / 2
expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
shell数值计算
算术扩展语法:$((算术表达式)),注意:表达式中若有变量,该变量名称之前最好不要加上$这个符号
练习:
j=10
echo $((j*4))
echo $((j*4/3))
echo $((++j))
echo $((--j))
echo $((4+j--))
echo $j
echo $((2**5)) #2的5次方
使用$[]做算术运算和$(())类似
练习:
echo $[4+5]
echo $[4-5]
echo $[4*5]
echo $[22/5]
r=$[100%43]
echo $[r**2]
Shell程序设计的流程控制
命令的结束状态,bash shell脚本程序可由许多命令组成,每一个命令执行后,都会传回一个结束状态值,若执行成功,传回0,如果执行失败,则传回非0值。
bash的内置变量$?,用来存储每个命令执行后传回的状态值。
bash流程控制需要进行条件测试,就是以结束状态作为真假值的判断依据,如果结束状态为0,则判断为真,其它值判断为假。
test是Shell程序中的一个表达式(注意:test内置命令/usr/bin/[ ),test命令用于检查某个条件是否成立,它可以进行字符、数值和文件三个方面的测试。
字符串测试
常用的字符串比较符号如下。
=:比较两个字符串是否相同,相同则为“是”。
!=:比较两个字符串是否不相同,不同则为“是”。
-n:比较字符串的长度是否大于0,如果大于0则为“是”。
-z:比较字符串的长度是否等于0,如果等于0则为“是”。
练习:
str1=”” #字符串为空串
test $str1
echo $?
str1=”“ #字符串含一个空格
test $str1
echo $?
test “$str1”
echo $? #仔细思考上述命令结果的不同
str1=abcd
test $str1 = abcd
echo $?
test $str1 = abcde
test –n $str1
echo $?
test –z $str1
echo $?
常用的数字比较符号如下。
-eq:相等。
-ge:大于等于。
-le:小于等于。
-ne:不等于。
-gt:大于。
-lt:小于。
练习:
i1=1234
i2=3456
[ $i1 –eq $i2 ] #注意各参数之间的空格
echo $?
[ $i1 –ne $i2 ]
echo $?
[ $i1 –lt $i2 ]
echo $?
文件测试表达式通常是为了测试文件的文件操作逻辑,测试符号如下。
-d:对象存在且为目录,则返回值为“是”。
-f:对象存在且为文件,则返回值为“是”。
-L:对象存在且为符号连接,则返回值为“是”。
-r:对象存在且可读,则返回值为“是”。
-w:对象存在且可写,则返回值为“是”。
-x:对象存在且可执行,则返回值为“是”。
-s:对象存在且长度非0,则返回值为“是”。
!:测试条件的否定。
练习:
mkdir ex7
cd ex7
touch a
ln –s a b
[ -d a ]
echo $?
[ ! –d a ]
[ -f a ]
echo $?
[ -r a ]
echo $?
[ -L a ]
echo $?
[ -L b]
echo $?
常用的逻辑测试符号如下。
!:与一个逻辑值相反的逻辑值。
-a与(and):两个逻辑值都为“是”返回值才为“是”,反之为“否”。
-o或(or):两个逻辑值有一个为“是”,返回值就为“是”。
bash的一些内部命令
常用的内部命令有:echo、eval、exec、export、readonly、read、shift、wait和点(.)。下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上打印出由arg指定的字符串。
2.eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
例: cmd=“ps –a”
eval $cmd
cmd=ls
para=-h
eval $cmd $para
3.exec
命令格式:exec 命令命令参数
功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。
4.export
命令格式:export 变量名或:export 变量名=变量值
功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly 变量名
功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出所有只读的shell变量。
6.read
命令格式: read 变量表
功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
例: read a b c
1 2
2 333
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2……在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,直到减到0($#为0)。
练习:编写Shell程序test.sh,内容如下
#!/bin/bash
while [ $# -gt 0 ]
do
echo $1
shift
done
执行bash test.sh 1 2 3 4 5 6 7
思考shift语句的作用
8.exit
功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。
9.“.”(点)
命令格式:. Shell程序文件名
功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。( 等价source命令)
Shell流程控制语句
Shell程序中的条件分支是通过if条件语句来实现的,其一般格式有if-then语句和if-then-else 语句两种
(1)if-then 语句
if-then语句的语法如下:
if命令行1
then
命令行2
fi
练习:书例7.9
#!/bin/bash
#filename:bbbb
echo –n “Do you want to continue: Y or N”
read ANSWER
if [ $ANSWER=N –o $ANSWER=n ]
then
exit
fi
if-then-else语句
if-then-else语句的语法如下:
if
命令行1
then
命令行2
else
命令行3
fi
练习:书例7.10
#! /bin/bash
#filename:ak
echo –n “please input a score:”
read SCORE
echo “You input Score is $SCORE”
if [ $SCORE –ge 60 ]
then
echo –n “Congratulation!You pass the examination.”
else
echo –n “Sorry!You fail the examination!”
fi
echo –n “press any key to continue!”
read GOOUT
case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其语法格式如下所示:
case string in
exp-1)
若干个命令行1
;;
exp-2)
若干个命令行2
;;
……
*)
其他命令行
esac
练习:书例7.11
#! /bin/bash
#filename:za
#Display a menu
echo
echo “1 Restore”
echo “2 Backup”
echo “3 unload”
echo
#Read and excute the user?s selection
echo –n “Enter Choice:”
read CHOICE
case “$CHOICE” in
1) echo “Restore”;;
2) echo “Backup”;;
3) echo “Unload”;;
*) echo “Sorry $CHOICE is not a valid choice”
exit 1
esac
for循环语句
a.for对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序中以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。
一般语法格式为:
for 变量名[in数值列表]
do
若干个命令行
done
练习:书例7.12
# ! /bin/bash
#filename:mn
for ab in 1 2 3 4
do
echo $ab
done
书例7.13
#! /bin/bash
#filename:qqq
sum=0
for INT in $*
do
sum=`expr $sum + $INT` #注意命令代换用反撇号”`”
done
b.for的另一种用法,和传统程序语言中的for 很像,语法为:
for((初始条件;终止条件;异动项))
do
命令区域
done
例:for ((i=1;i<=10;i=i+1))
do
……
done
*无穷循环
for ((;1;))……
练习:使用for语句创建一个Shell程序,其功能为1+2+3+4+5+……+n
参考:
#! /bin/bash
#filename:ex75.sh
echo –n “Please input n:”
read NUM
expr $NUM + 0 &>/dev/null #执行expr命令判断NUM中是否是数值,将标准输出与错误输出全部重定向至/dev/null
if [ $? –ne 0 ]; then
echo “ERROR:$NUM is not a number!”
exit 1
elif [ $NUM –lt 1 ]; then #注意此处elif的用法
echo “ERROR:$NUM is not greater than 1!”
exit
else
SUM=0
for ((i=1;i do SUM=$((SUM+i)) done echo “The sum of 1+…+$NUM is $SUM” fi while语句是用命令的返回状态值来控制循环的。while循环的一般语法格式为:while 若干个命令行1 do 若干个命令行2 done 只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行“do...done”之间的“若干个命令行2”。 练习:书例7.14 #!/bin/bash int=1 while [ $int –le 5 ] do sq=`expr $int \* $int` echo $sq int=`expr $int +1` done echo “Job Completed” 书例7.15 #!/bin/bash #filename:sum echo –n “Please Input Number:” read NUM number=0 sum=0 while [ $number –le $NUM ] echo number echo “$number” number=` expr $number+1` echo sum echo “$sum” sum=` expr $sum + $number ` done echo until语句是另一种循环结构,它和while语句相似,其语句格式如下: until 若干个命令行1 do 若干个命令行2 done *until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。 练习:书例7.17 #!/bin/bash #filename:hk echo “This example is for test until….do” echo “If you input [exit] then quit the system” echo –n “please input:” read EXIT until [ $EXIT = ”exit” ] do read EXIT done echo “OK!” 使用until语句创建一个Shell程序,其功能为计算1~10的平方。参考: #! /bin/bash NUM=1 until [ $NUM –gt 10 ] do echo –n “The square of $NUM is:” echo $[NUM**2] NUM=$[NUM+1] done Thizlinux 系统教程 Shell 经典实例 ----------------Milo 经典小shell 1 列目录树的shell 脚本如下: #!/bin/sh # dtree: Usage: dtree [any directory] dir=${1:-.} (cd $dir; pwd) find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" 2 while中使用read (file是一个文件) cat file | while read line do echo $line echo " :: Please input any key(s):c" str4read="" while true do chr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null` str4read=$str4read$chr4read if [ "$chr4read" = "" ] ;then break; fi done echo " :: |$str4read|" done 3 将多个空格替换为字符 sed 's/[ ][ ]*/ /g' 如果空格与tab共存时用 sed -e 's/[[:space:]][[:space:]]*/ /g' filename 4用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi 1.写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。 #!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 2.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。 #!/bin/sh case ${1##*.tar.} in bz2) tar jxvf $1 ;; gz) tar zxvf $1 ;; *) echo "wrong file type" esac 3.写一个脚本以方便用户查询rpm的相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是则循环刚才的过程,否则退出。 #!/bin/sh RPM=/bin/rpm option="-q" while true do echo "what to query?" select var in "All" "file" "package name" do case $var in All) option=$option"a" break ;; file) echo -n "please input file name: " Linux shell 脚本实例 1. 写一个脚本,利用循环计算10的阶乘#!/bin/sh factorial=1 for a in `seq 1 10` do factorial=`expr $factorial \* $a` done echo "10! = $factorial" 2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。#!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done ////////////////////////////////////////// #!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 3. 写一个脚本,利用循环和continue关键字,计算100以内能被3整除的数之和 4.一个函数,利用shift计算所有参数乘积,假设参数均为整数 #! /bin/sh result=1 while [ $# -gt 0 ] do result=`expr $result * $1` shift done echo $result 5.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。#!/bin/shcase ${1##*.tar.} in bz2) tar jxvf $1 ;; gz) tar zxvf $1 ;; *) echo "wrong file type"esac6.写一个脚本以方便用户查询rpm的相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是则循环刚才的过程,否则退出。 第12章 Shell 脚本编程 ● Shell 命令行的运行 ● 编写、修改权限和执行Shell 程序的步骤 ● 在Shell 程序中使用参数和变量 ● 表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序 12-1 Shell 命令行书写规则 ◆ Shell 命令行的书写规则 对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “ this is \ >long command ” This is long command 注意: “>”符号是自动产生的,而不是输入的。 12-2 编写/修改权限及执行Shell 程序的步骤 ◆ 编写Shell 程序 ◆ 执行Shell 程序 Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。 12-2-1 编辑Shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #! /bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day !” 注意: #! /bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date 命令前加符号“&”,其中%B%d%A为输入格式控制符。 12-2-2 建立可执行程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行程序权限。使用如下命令。[root@localhost bin]#chmod +x date 12-2-3 执行Shell程序 执行Shell程序有下面三种方法: 方法一: [root@localhost bin]#./ date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法二: 另一种执行date的方法就是把它作为一个参数传递给Shell命令: [root@localhost bin]# Bash date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法三: 为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。 具体操作如下: [root@localhost root]#export PATH=/bin:$PATH [root@localhost bin]# date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 【例子:001】判断输入为数字,字符或其他 1.#!/bin/bash 2.read -p "Enter a number or string here:" input 3.case $input in 4. [0-9]) echo -e "Good job, Your input is a numberic! \n" ;; 5.[a-zA-Z]) echo -e "Good job, Your input is a character! \n" ;; 6. *) echo -e "Your input is wrong, input again! \n" ;; 7.esac 【例子:002】求平均数 1.#!/bin/bash 2.# Calculate the average of a series of numbers. 3.SCORE="0" 4.AVERAGE="0" 5.SUM="0" 6.NUM="0" 7.while true; do 8. echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE; 9. if (("$SCORE" < "0")) || (("$SCORE" > "100")); then 10. echo "Be serious. Common, try again: " 11. elif [ "$SCORE" == "q" ]; then 12. echo "Average rating: $AVERAGE%." 13. break 14. else 15. SUM=$[$SUM + $SCORE] 16. NUM=$[$NUM + 1] 17. AVERAGE=$[$SUM / $NUM] 18. fi 19.done 20.echo "Exiting." 【例子:003】自减输出 1.[scriptname: doit.sh] 2.while (( $# > 0 )) 3.do 4. echo $* 5. shift 6.done 7./> ./doit.sh a b c d e 8. a b c d e 9. b c d e 10.c d e #! /bin/sh echo "Current command is $0" echo "The first parameter is $1" echo "The second parameter is $2" echo "The third parameter is $3" echo "Total of parameters if $#" echo "Current PID is $$" #!/bin/bash times=0 until [ "$times" = 3 ]; do echo "I love linux." sleep 2 times=`expr $times + 1` done #!/bin/bash # menu shell script. samli 2004.4.19 until echo "List Directory..........1" echo "Change Directory........2" echo "Edit File...............3" echo "Remove File.............4" echo "Exit Menu...............5" read choice test $choice = 5 do case $choice in 1) ls;; 2) echo "enter target directory:" read dir cd $dir ;; 3) echo "enter file name:" read file vi $file ;; 4) echo "enter file name:" read file rm $file ;; 5) echo "Goodbye" # vi xx.sh 退出并保存 # chmod +x xx.sh # ./xx.sh -2.调试脚本的方法 # bash -x xx.sh就可以调试了. -1.配置secureCRT的设置(我用的是6.2.3 build313版本,汉化版) 选项->会话选项(S)...->终端->仿真->终端(T)->把VT100改成Xterm->点中ANSI 颜色(A)和使用颜色方案(U)复选框. 这样就有颜色显示了. 选项->会话选项(S)...->终端->外观->字符编码(H)->从Default变到UTF-8. 这样就有中文显示了. 1.写一个脚本,执行后,打印一行提示"Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值.直到用户输入"end"停止. # vi show_var.sh 脚本内容: #!/bin/bash unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 命令保存后退出,并执行: # chmod +x show_var.sh # ./show_var.sh please input a number: 1 var is 1 please input a number: s var is s please input a number: end # 2.写一个脚本,测试位置参数 1、打印位置变量的个数和位置变量的内容 #! /bin/sh echo "Current command is $0" echo "The first parameter is $1" echo "The second parameter is $2" echo "The third parameter is $3" echo "Total of parameters if $#" echo "Current PID is $$" 2、循环打印“I love linux”3次 #!/bin/bash times=0 until [ "$times" = 3 ]; do echo "I love linux." sleep 2 times=`expr $times + 1` done 3、完成菜单程序的功能: 1)列出当前的文件 2)更改路径 3)编辑文件 4)删除文件 #!/bin/bash # menu shell script. until echo "List Directory..........1" echo "Change Directory........2" echo "Edit File...............3" echo "Remove File.............4" echo "Exit Menu...............5" read choice test $choice = 5 do case $choice in 1) ls;; 2) echo "enter target directory:" read dir cd $dir ;; 3) echo "enter file name:" read file vi $file 一些自己练习时所写的简单shell脚本 (centos 6.3)【复制粘贴时请注意空格、引号、分号等格式】1、使用for循环、while循环、until循环计算100以内所有偶数的和 for循环: #!/bin/sh Sum=0 for i in `seq 0 2 100` #也可用for i in $(seq 0 2 100) #或者for (( i=0;i<=100;i+=2 )) do let “Sum+=i” done echo “SUM=$Sum” exit 0 while循环: #!/bin/sh Sum=0 i=0 while [ “$i”–le 100 ] do let “Sum+=i” let “i+=2” done echo “SUM=$Sum” exit 0 until循环: #!/bin/sh Sum=0 i=0 until [ “$i”–gt 100 ] do let “Sum+=i” let “i+=2” done echo “SUM=$Sum” exit 0 2、通过循环实现从1开始叠加,直到和的结果大于2000为止(使用break循环控制符) #!/bin/sh Sum=0 for (( i=1;;i++) do let “Sum+=i” if [ “$Sum”–gt 2000 ] then echo “i=$i” echo “SUM=$Sum” break done exit 0 3、找出100以内所有能被3整除的数,每行显示8个数,然后换行显示#!/bin/sh times=0 #循环次数 for i in $(seq 1 100) do let “temp=i%3” let “times++” if [ “$temp”–eq 0 ] then printf “$i” let “a=times%8” if [ “$a”–eq 0 ] then printf “\n” fi fi done printf “\n” exit 0 4、打印九九乘法表 #!/bin/sh for (( i=1;i<=9;i++) do for (( j=1;j<=i;j++ )) do let “temp=i*j” echo –n “$j*$i=$temp “ done echo “” done exit 0 5、显示颜色类型,并让用户选择(使用select结构) #!/bin/sh echo “What is your favorite color?” select color in “red”“blue”“green”“white”“black” do break done echo “You have selected $color.” exit 0 6、显示当前工作目录下的文件数和目录数 #!/bin/sh Number() { let “dir_number=0” let “file_number=0” Shell脚本抽取实例 #!/usr/bin/ksh 1. 应用地址变量引用 myself="backup_chncm_file.sh" logfile="${MCB_HOME}/${MCB_APPID}/var/log/${procname}.log" 2. case实例 case ${MCB_APPID} in chs) ic_dir="/opt/mcb/chs/data/*/inroam/incoming" arch_dir="/opt/mcb/chs/back" file_pattern="[AC][CD]?????CHNCM*" db_user="chsdba" ;; ops) ic_dir="/opt/mcb/ops/data/incoming/ics" arch_dir="/opt/mcb/ops/arch/incoming/ics" file_pattern="[AC][CD]?????CHNCM*" db_user="iogsmdba" ;; *) MCB_APPID=dps1 echo "MCB_APPID is not in chs/ops, please check!" exit 1 ;; esac 3. 判断参数个数实例 if [ $# -lt 1 ];then echo "SERIOUS:DBMSG() need 1 argument: DEBUGMSG" return 1 fi 4. 判断结果实例 if [ $? -ne 0 ];then message="query carriers table failed! db_user=${db_user} db_passwd=${db_passwd} db_sid=int1" 1、用shell脚本批量建立Linux用户 实现要求:创建用户student1到student50,指定组为student组!而且每个用户需要设定一个不同的密码! 脚本实现如下: #!/bin/bash for i in `seq 1 50` do useradd -G student student$i ; echo student$i | passwd student$i --stdin; done 【说明:Linux下Passwd有参数 --stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe. 所以linux下自动改变用户密码的办法就是: Echo 密码|passwd –stdin 用户名 】 -------------------设置相同的密码------------------------ #!/bin/bash password="123456" for USER in user1 user2 user3 do useradd -m $USER echo -e "${password}\n${password}" | passwd $USER done 【说明: echo -n 不换行输出: $echo -n "123" $echo "456" 最终输出 123456 而不是 123 456 echo -e 处理特殊字符: \n 换行且光标移至行首】 ok,就这么一个简单的脚本,就可以再系统里批量生成账号了。而且密码跟账号的名字一样。 这就是for do done语句用法。 2、编写shell脚本,将/usr/local/test目录下大于100k的文件转移到/tmp 目录下: #!/bin/bash for FILE in `ls /usr/local/test` do if [ -f $FILE ] ; then if [ `ls -l $FILE | awk `{print $5}` -gt 100000 ] ; then mv $FILE /tmp/ fi fi done ================ #!/bin/bash for FileName in `ls -l /usr/local/test | awk '$5>102400' {print $9}` linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash 的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写: shell脚本实例 1. 写一个脚本,利用循环计算10的阶乘 #!/bin/sh factorial=1 for a in `seq 1 10` do factorial=`expr $factorial \* $a` done echo "10! = $factorial" 注:上面有一行,for a in `seq 1 10`,其中seq 1 10 , 即列出现1到10之间所有的数字,这一行也可改为:for a in "1 2 3 4 5 6 7 8 9 10" 2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然 后打印出该数值,然后再次要求用户输入数值。直到用户输入 "end"停止。 #!/bin/sh while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 3. 写一个脚本,利用循环和continue关键字,计算100以内能被3整除的数之和#!/bin/sh sum=0 for a in `seq 1 100` do if [ `expr $a % 3` -ne 0 ] then continue echo $a sum=`expr $sum + $a` done echo "sum = $sum" 4.一个函数,利用shift计算所有参数乘积,假设参数均为整数( 特殊变量$# 表示包含参数的个数) #! /bin/sh result=1 while [ $# -gt 0 ] do result=`expr $result \* $1` shift done echo $result 5.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。 #!/bin/sh Shell脚本for循环应用实例 实例1,提示用户输入一个数字,判断用户输入是否为纯数字,若为纯数字,对该数字进行阶层运算和求和运算,如3!=1*2*3,输出结果为3!=6,Σ5=15. 实现程序代码 #!/bin/bash #打印该程序的功能 echo -e "\nThis program will calculate num! and output the result.\n" #提示用户输入,并将输入的数字赋值给num read -p "Please input a number:" num #初始化记录阶层运算的变量 order=1 #初始化记录求和运算的变量 sum=1 #判断是否为纯数字,如果为纯数字就为false,如果不是纯数字就为true if [[ $num =~ [^0-9] ]] then #当不为纯数字就提示输入纯数字 echo "You should input a number!" else #进行就和与阶层运算 for i in `seq 1 ${num}`#注意不是单引号,而是反引号 do #开始进行阶层运算 order=$(( $i * $order )) #开始进行求和运算 sum=$(( $i + $sum )) done #输出就和的结果 echo -e "\n${num} sum is ${sum}" #判断阶层结果,如果等于零就说明输入的数字过大,超出计算机运行内存,无法完成计算 if [ ${order} == 0 ] then #提示输入的数字过大 echo -e "\nThe number too large to can't calculate!\n" else #输出求阶层的结果 echo -e "\n${num}!=${order}\n" fi fi 总结:该案例主要是对for循环的使用,还有双括符的使用,双括符是运算高级的数学表达式。结合if语句将正确的结果输出。Shell 经典实例
linux脚本实例
经典shell 脚本实例
Shell脚本编程详解-吐血共享
Shell脚本-Demo-29例
LinuxShell脚本编程实例
Shell脚本例子集合
LinuxShell脚本编程实例
linux下简单shell脚本例子
Shell脚本抽取实例
shell的十个例子
linux Shell(脚本)编程入门 实例讲解详解
shell脚本实例
shell脚本for循环案列