学习Shell Script
Table of Contents
- 1 什么是Shell Scipt
- 1.1 程序书写
- 1.2 程序执行
- 2 简单Shell练习
- 2.1 例1 接收用户输入
- 2.2 例2 按日期建立相似名字的文件
- 3 判断式
- 3.1 测试文件是否存在
- 3.2 test常用选项
- 3.2.1 文件类型
- 3.2.2 权限
- 3.2.3 文件新旧比较
- 3.2.4 整数,字符串,多重条件判断
- 3.3 使用[]判断
- 4 Shell Script 参数
- 5 条件表达式
- 5.1 if 结构
- 5.2 if else 结构
- 5.3 case
- 6 函数
- 7 循环
- 7.1 while
- 7.2 for
- 8 shell script的追踪与Debug
1 什么是Shell Scipt
使用指令和基本程序设计结构写成的程序,可以完成复杂的处理流程
1.1 程序书写
#!/bin/bash# Program:# This program shows "Hello Wrold" in your screen.# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHecho -e "Hello World!\a\n"exit 0
- 第一行 #!/bin/bash 说明使用的shell类型,不同shell语法可能不同,所以要说明使用的是哪种shell
- 其它#开始的表示注释,注释一般需要说明
- 程序功能
- 版本历史
- 作者及联系方式
- 设置好PATH变量,以便直接可以调用相应路径下的命令
- 程序主体部分
- exit 0 表示程序执行成功,向环境返回0
1.2 程序执行
- bash $bash sh01.sh #如果用sh sh01.sh而sh又不是指向bash,那么sh01.sh内的语法就会不一致,因为用 #sh去解释了bash语法写的shell script,针对这个程序,如果 #$type sh #得到sh is hashed (/bin/sh) #那么会输出-e Hello world!,而非Hello world!
- $./xxx.sh $chmod +x sh01.sh $./sh01.sh
- source $ source sh01.sh
注:用bash和用source的不同在于,用bash执行时,shell script其实是在在父程序bash下新建了一个 bash子程序,这个子程序中执行,当程序执行完后,shell script里定义的变量都会随子程序的结束而消失, 而用source执行时,是在父程序bash中执行,shell script里定义的变量都还在。
2 简单Shell练习
2.1 例1 接收用户输入
# !/bin/bash# Program:# This program is used to read user's input # History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHread -p "Your first name:" firstname # tell user to inputread -p "Your last name:" lastname # tell user to inputecho -e "\nYour full name: $firstname $lastname"exit 0
$ bash sh02.shYour first name:MinixYour last name:007Your full name: Minix 007
2.2 例2 按日期建立相似名字的文件
# !/bin/bash# Program:# This program is used to create files according to date# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATH# Get filename from userecho -e "I will use 'touch' to create three files."read -p "Please input your filename:" tmpfilename# Prevent the user input [Enter]# Check whether filename exists or notfilename=${tmpfilename:-"filename"}# Get the final filename according to datedate1=$(date --date='2 days ago' +%Y%m%d) # date of 2 days agodate2=$(date --date='1 days ago' +%Y%m%d) # date of yesterdaydate3=$(date +%Y%m%d) # date of todayfilename1=${filename}${date1}filename2=${filename}${date2}filename3=${filename}${date3}# Create filetouch "$filename1"touch "$filename2"touch "$filename3"exit 0
$ bash sh03.shI will use 'touch' to create three files.Please input your filename:WhoKnows$ ls W*WhoKnows20130201 WhoKnows20130202 WhoKnows20130203
3 判断式
3.1 测试文件是否存在
test -e filename会根据filename是否存在返回0或1,再交由echo显示结果
$ test -e sh01.sh && echo "Exists" || echo "Not exists"Exists$ test -e sh0x.sh && echo "Exists" || echo "Not exists"Not exists
3.2 test常用选项
3.2.1 文件类型
- -e file :file是否存在
- -f file :file是否存在且为文件
- -d file :file是否存在且为目录
3.2.2 权限
- -r file :file是否有读的权限
3.2.3 文件新旧比较
- -nt file1 file2 : file1 是否比 file2新
3.2.4 整数,字符串,多重条件判断
- -z string: string是否为空
例:输出指定文件类型及属性
# !/bin/bash# Program:# This program is used to output type and permission of the target file# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATH# Get filename from userecho -e "Input name of the file that you want to check.\n"read -p "Filename:" filenametest -z $filename && echo "You must input a filename." && exit 0# Check whether the file exists or nottest ! -e $filename && echo "The file '$filename' DO NOT exists" && exit 0# Check type and permission of the filetest -f $filename && filetype="regular file"test -d $filename && filetype="directory"test -r $filename && perm="readable"test -w $filename && perm="$perm writable"test -x $filename && perm="$perm executable"# Output resultecho "The filename:$filename is a $filetype"echo "And Permissions are :$perm"exit 0
$ bash sh04.shInput name of the file that you want to check.Filename:sh01.shThe filename:sh01.sh is a regular fileAnd Permissions are :readable writable executable
3.3 使用[]判断
- 测试文件是否存在
$ [ -e "sh01.sh" ] ; echo $?0$ [ -e "sh0x.sh" ] ; echo $?1
- 注意[]内空格必须有
- 这种方法和test的test -e "sho1.sh" ; echo $? 是一致的
4 Shell Script 参数
# !/bin/bash# Program:# This program is used to ouput parameter of the shell script# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHecho "The script's name is ==> $0"echo "Total parameter number is ==> $#"# Check whether number of the parameter is less than 2[ "$#" -lt 2 ] && echo "The number of parameter is less than 2.Stop here." && exit 0echo "The whole parameter is ==> '$@'"echo "The first parameter is ==> $1"echo "The first parameter is ==> $2"exit 0
$ bash sh05.sh 1a 2b 3c 4dThe script's name is ==> sh05.shTotal parameter number is ==> 4The whole parameter is ==> '1a 2b 3c 4d'The first parameter is ==> 1aThe first parameter is ==> 2b
注:从以上程序可以看出与参数有关的预设变量如何表示
5 条件表达式
5.1 if 结构
# !/bin/bash# Program:# This program is used to show if else expression# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHread -p "Please input [Y/N]" choiceif [ "$choice" == "Y" ] || [ "$choice" == "y" ];then echo "OK, continue" exit 0fiif [ "$choice" == "N" ] || [ "$choice" == "n" ];then echo "Oh, interupt" exit 0fiexit 0
$ bash sh06.shPlease input [Y/N]yOK, continue$ bash sh06.shPlease input [Y/N]nOh, interupt
5.2 if else 结构
# !/bin/bash# Program:# This program is used to show if else expression# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHread -p "Please input [Y/N]" choiceif [ "$choice" == "Y" ] || [ "$choice" == "y" ];then echo "OK, continue" exit 0elif [ "$choice" == "N" ] || [ "$choice" == "n" ];then echo "Oh, interupt" exit 0else echo "Input [Y/N]"fiexit 0
5.3 case
# !/bin/bash# Program:# This program is used to show case expression# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHread -p "Tell me your choice:[1-3]=>" choicecase $choice in "1") echo "Your choice is ONE" ;; "2") echo "Your choice is TWO" ;; "3") echo "Your choice is THREE" ;;esacexit 0
$ bash sh08.shTell me your choice:[1-3]=>2Your choice is TWO$ bash sh08.shTell me your choice:[1-3]=>1Your choice is ONE$ bash sh08.shTell me your choice:[1-3]=>3Your choice is THREE
6 函数
# !/bin/bash# Program:# This program is used to test function# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHfunction myprint(){ echo -n "Your choice is "}read -p "Tell me your choice:[1-3]=>" choicecase $choice in "1") myprint;echo "ONE" ;; "2") myprint;echo "TWO" ;; "3") myprint;echo "THREE" ;;esacexit 0
$ bash sh09.sh Tell me your choice:[1-3]=>1Your choice is ONE$ bash sh09.sh Tell me your choice:[1-3]=>2Your choice is TWO$ bash sh09.sh Tell me your choice:[1-3]=>3Your choice is THREE
7 循环
7.1 while
# !/bin/bash# Program:# This program shows while expression# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHwhile [ "$choice" != "yes" ]do read -p "Give your choice [yes/no]:" choicedoneexit 0
$ bash sh10.sh Give your choice [yes/no]:noGive your choice [yes/no]:noGive your choice [yes/no]:nxGive your choice [yes/no]:yes
7.2 for
# !/bin/bash# Program:# This program is used to demo for expression# History:# 2013/2/3 on_1y First releasePATH=$PATHexport PATHfor choice in 1 2 3do echo "your choice is $choice"doneexit 0
$ bash sh11.shyour choice is 1your choice is 2your choice is 3
8 shell script的追踪与Debug
- sh -n xx.sh # 语法检查
- sh -x xx.sh # 列出xx.sh的执行过程