• 1. Lesson09 Shell脚本
  • 2. 复习配置文件与source命令 特殊符号:? * [] ; && || 重定向 管道:cut sort wc uniq tee tr grep
  • 3. 内容提要正则表达式 Shell Scripts
  • 4. 正则表达式正则表达式 . 代表一个任意字符,一定要有一个字符存在 ? 匹配0次或者1次,也可以用于表示单一字符 * 匹配任意次,也可以用于表示任意字符 [list] 列表中的字符 [range] 列表中范围内的字符,范围用“-”分隔
  • 5. 正则表达式正则表达式 [^list] 不属于list的元素,与 [list] 相反 [^range] 不属于range的元素,与 [range]相反 \{n\} 与前一个相同条件连续匹配n个 \{n,m\} 与前一个相同条件连续匹配n到m个
  • 6. 正则表达式正则表达式实验,假设有如下文本,文件名称为t: hi, i am eric, my phone is 023-68587573 mobile phone is 13667620661 at changsha , i will use 0731-6858670 my id is 22334455667 my email is eric-hxy@163.com may be u can also use ERIC-HXY@163.COM call me please bye
  • 7. 正则表达式问题: 如何查找文本中的移动电话? grep -e "13[0-9]\{9\}" 如何查找文本中的固定电话号码? grep -e "0[0-9]\{2,3\}-[0-9]\{7,8\}"
  • 8. Shell Scripts什么是Shell Scripts? 一系列连续命令 如何执行? 使文件具备执行属性,然后执行 使用sh命令,如sh a
  • 9. Shell Scripts建立第一个脚本: vi test01 输入 echo hello scripts world 保存退出 增加可执行权限:chmod a+x test01 执行./test01 去掉可执行权限: chmod a-x test01 执行./test01 执行 sh test01
  • 10. Shell Scripts默认变量类型是字符串,其他变量声明用d: 语法: declare [-afir] 变量名称[=初始值] 含义:-a定义数组,-f定义函数,-i定义整数,-r定义只读变量
  • 11. Shell Scripts变量声明举例: a1=10 b1=20 c1=$a1*$b1 echo $c1 declare -i a2=10 declare -i b2=20 declare -i c2=$a2*$b2 echo $c2 实验
  • 12. Shell Scripts变量声明注意事项: 变量赋值等号两边不能有空格 如果变量值包含空格,最好使用引号。如果没有引号,那么该值中的第二个单词会当作命令执行。例如: aa=b pwd aa=b pwdd echo命令打印变量时,最好用引号括起,否则echo将解析其中的特殊符号,列出当前目录下面的文件名称,例如: aa=* echo $aa 如果“$variable”表示一个命令,则会自动执行它,例如:aa=pwd ; $aa
  • 13. Shell Scriptsset命令的其他用法: set [参数列表] 效果:依次把各位置参数设置为参数列表中的值,从$1开始 举例: set `date` echo $1,$2,$3 注意:如果参数列表中第一个可能以-开头,则应该使用set – [参数列表],例如: set "-a -b -c" set -- "-a -b -c" echo $@
  • 14. Shell Scriptsshell算术运算(1/2): 可以使用 shell 结构来执行简单的整数运算。只需将特定的算术表达式用 "$((" 和 "))" 括起,bash 就可以计算表达式 举例: echo $(( 100 / 3 )) myvar="56" echo $(( $myvar + 12 )) echo $(( $myvar - $myvar )) myvar=$(( $myvar + 1 )) echo $myvar
  • 15. Shell Scriptsshell算术运算(2/2): 也可以使用“expr 表达式”来计算表达式的值。可以使用的运算符包括= > >= <= ! + - * / %等 注意:使用转义符号 举例: a=100 echo `expr $a \* $a` echo `expr $a \> $a` echo `expr $a \= $a`
  • 16. Shell Scripts跟用户交互read: echo input u name: read name echo u name is $name 参数的读取: $0代表命令或者脚本名称,$1代表第一个参数,一直到9 实验
  • 17. Shell Scriptsshift命令 作用:将参数左移 语法:shift [N] 含义:将命令行参数左移N个位置,默认为1 举例: echo $0 $1 $2 shift echo $0 $1 $2 shift 2 echo $0 $1 $2
  • 18. Shell Scripts常用的逻辑判断: -f 检测文件是否存在 -d 检测目录是否存在 -e 检测对象是否存在,对象可以是任何东西 -r 文件是否具备可读属性 -w 是否可写 -x 是否可执行 -s 文件是否非空 -u 文件是否具备SUID -g 文件是否具备SGID -k 文件是否具备sticky bit属性 && 逻辑与 || 逻辑或
  • 19. Shell Scripts常用的整数运算符: -eq 等于 -ne 不等于 -lt 小于 -gt 大于 -le 小于或等于 -ge 大于或等于
  • 20. Shell Scripts常用的字符串运算符: str 若str为非空字符串则为真 str1=str2 若str1与str2相同则为真 str1!=str2 若str1与str2不相同则为真 str1str2 若str1比str2排序较大则为真 -z str 若str长度为0则为真 -n str 若str长度大于0则为真
  • 21. Shell Scripts字符串与数字比较的区别: myvar=1 if [ "$myvar" -eq 01 ]; then <=相等否? echo myvar is number 1 fi if [ "$myvar" = "01" ]; then <=相等否? echo myvar is char 01 fi
  • 22. Shell Scripts字符串比较经典问题(引号重要性): var1="who am i" var2="who" if [ $var2 = "who" ]; then echo oho fi if [ $var1 = "who am i" ]; then echo yeah fi 应用字符串变量时最好把双引号加上
  • 23. Shell Scripts条件判断: 最简单的条件判断 if [ condition ];then action fi 注意: 在[]中,只能有一个判断式 在[]与[]之间,可以使用&&或||组合
  • 24. Shell Scripts条件判断: 复杂的if语句: if [ condition ]; then action elif [ condition2 ]; then action2 elif [ condition3 ]; then else actionx fi
  • 25. Shell Scripts问题1: 如果用户输入Y或者y就打印hello,否则打印bye,这个脚本该如何写? echo "press any key to continue" read key if [ "$key" = "y" ] || [ "$key" = "Y" ]; then echo "hello" else echo "bye" fi
  • 26. Shell Scripts问题2: 根据用户输入进行判断,如果是目录,则列出目录下文件的数量,否则列出文件的大小和inode if test -f $1 then filename=$1 set `ls -il $filename` echo file $filename inode=$1 and size=$6 fi if [ -d $1 ]; then count=`ls $1 | wc -w` echo directory $1 have $count files exit 0 fi
  • 27. Shell Scripts条件判断: 分支判断: case 字符串 in 串1) 动作1 ;; 串2) 动作2 ;; *) 动作3 esac
  • 28. Shell Scripts问题: 根据用户输入字符串的长度判断,如果长度为3,就在其前面加入00,如果为4,则加入0,其他情况则加入haha_,打印最后结果,该如何写? echo "input a string:" read str count=`echo $str|wc -m` case $count in 4) str=00$str ;; 5) str=0$str ;; *) str=haha_$str esac echo "now str is :$str"
  • 29. Shell Scripts循环: for语句: for((条件1;条件2;条件3)) do action done for 变量 [in 变量1 变量2 ...] do action done 注意:不带in部分时参数有命令行提供
  • 30. Shell Scripts简单for实例: for i in eric carol hexy do echo "hello $i" done for a in ./* do if [ -f "$a" ]; then echo $a fi done
  • 31. Shell Scripts问题:如何读取所有命令行参数进行显示? declare -i i for a do i=i+1 echo $i parameter is $a done
  • 32. Shell Scripts循环: while语句:只要条件满足就一直执行 while [条件] do action done
  • 33. Shell Scripts循环: until语句:直到满足条件才退出 until [条件] do 动作 done
  • 34. Shell Scripts问题1:分别用while和until来实现打印1到10数字 declare -i i=1 while [ $i -le 10 ] do echo $i i=i+1 done until [ $i -gt 10 ] do echo $i i=i+1 done
  • 35. Shell Scripts问题2:写一个脚本,把所有参数计算所有参数之和 count=0 while [ $# != 0 ] do count=$(($count + $1)) #count=`expr $count + $1` shift done echo count is $count
  • 36. Shell Scripts函数定义 语法: 函数名称() { 函数体 } 函数调用方法: 函数名称
  • 37. Shell Scripts函数举例: myvar="hello" myfunc(){ myvar="one two three" for x in $myvar do echo $x done } #invoke function myfunc echo $myvar $x
  • 38. Shell Scripts解决函数中的名字空间问题,使用local: myvar="hello" myfunc(){ local myvar="one two three" for x in $myvar do echo $x done } #invoke function myfunc echo $myvar $x
  • 39. Shell Scripts脚本调试: sh [-nv] scripts -n 不执行脚本,查询脚本语法,有错误就列出 -v 执行脚本之前,先将脚本内容提示在屏幕上 查看脚本实例(创建学生帐号)
  • 40. 小结正则表达式 set $((...)) read 逻辑判断 if for while until 函数