Bash入门基础篇

1,453 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,453
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Bash入门基础篇

  1. 1. Linux下Bash程序开发本教程适用于已经学习Linux指令的学员,利用 Bash编程有助于日常服务器的管理的便捷。编者寄予:希望多动手,开动脑筋,克服编程的恐 惧心理,Linux下Bash编程无非就是这么几条语 句,有志者事竟成。 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  2. 2. 怎样写 shell 脚本• 使用任何编辑工具编写shell脚本 例如 vi –#!/bin/bash #在第一行放置头格式说明• 在写完 shell 脚本之后,设置脚本执行权限 –chmod +x your-script-name –chmod 755 your-script-name• 执行你的脚本做测试 –bash your-script-name –sh your-script-name –./your-script-name 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  3. 3. shell 中的变量• Linux(Shell)中有两种类型的变量: –系统变量:由Linux系统本身维护,通常为大写的变量名 –用户定义变量(UDV): 由用户创建和维护,通常小写• 查看系统变量可以通过Linux指令 set 罗列出来• 在调用变量时,在名称前加以"$"(美元符号) –echo $USERNAME –echo $HOME 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  4. 4. 彩色Shell输出• echo -e 指令可以在控制台输出彩色的字符。• 色彩分为 前景色 和 背景色,十位数的数字 3 或 4 表示 –前景色 30-37(以3x代表) –背景色 40-47 ( 以4x代表)• 个位数表示为色彩 3 0 ( 黑色 ) 、 3 1 ( 红色 ) 、 3 2 ( 绿 色 ) 、 3 3 ( 黄 色) 、 3 4 ( 蓝色 ) 、 3 5 ( 洋红 ) 、 3 6 ( 青 色 ) 、 3 7 ( 白 色) 。• 前景色和背景色个位数不要一致,否则看不见任何信息(可以 用在密码输入处) 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  5. 5. 彩色Shell输出二• 使用格式: – 033[前景色 ; 背景色m #同时更改前/背景色 – 033[前景色m #只更改前景色 – 033[背景色m #只更改背景色 – 033[0m #还原所有的前/背景色,最后部分一定要还原色彩• echo "You are login to 033[34;40m bluefox 033[0m system" – 打印蓝色的 bluefox• 下面的代码用在防止密码被窥探 echo "Please input a password 033[34;44m" read PASSWD; echo "033[0m" echo PASSWD | openssl md5 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  6. 6. 如何定义用户自己的变量• 要定义UDV可以使用下面的语法: 变量名=值 (注意:等号之间没有空格)• 通过"="将右边的值赋给左边的变量 no=10 #正确 10=no #错误,值必须在右边 vech=Bus #定义一个vech变量其值为Bus n= 30 #错误,等号右边存在空格 n =20 #错误,等号左边存在空格 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  7. 7. 变量名的命名规则• 变量名必须以字符或者"_"(下划线)开头• 重复一次,"="等号两边不能有空格• 变量名区分大小写• 可以定义NULL值 –vech= #等号右边没有任何值 –vech="" #引号中没有任何的空格• 在变量名中不要使用"?"(问号),"*"(星号) 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  8. 8. 如何打印UDV• 要打印或调用变量时,使用下面的语法 $变量名 #在定义变量或赋值的时候不要"$" #定义变量 vech=Bus #显示变量 echo $vech• 不要使用 echo vech ,这样只会把vech当成一个字符串的值 打印出来,也就是在屏幕中输出 "vech"本身 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  9. 9. echo 命令• 使用 echo 命令可以显示文本或变量的值• echo [选项] [字符,变量...]• 选项 -n 不换行输出,默认echo一次换一行,用在持续的打印输出 -e 启用转义字符解析 a 响铃 b 退格 c 去除尾部的新行 n 新的一行 r 回车 t 水平制表符功能 斜杠 echo -e "An apple a day keeps away attdoctorn" 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  10. 10. shell中数学计算• 使用下面的语法执行数学运算,注意中间都存在空格,一次只能处理 两个数字 语法: expr 操作数1 数学计算 操作数2 expr 1 + 3 #加法计算得到4 expr 10 / 2 #除法计算得到5 expr 20 % 3 #求余数得到2 expr 10 * 3 #乘法特殊,由于"*"星号为通配符之一, #必须对"*"使用转义符,等到"*"本身 echo `expr 6 + 3` #显示结果,注意"`"(斜点)的使用,代表 #先行执行Bash命令• 如果使用 echo "expr 6 + 3"或者echo expr 6 +3将显示"expr 6 +3"字符本身 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  11. 11. 引号的使用• 我们来区分一下引号 ""(双引号) 对""做转义,对"$"的变量做解析 (单引号) 其中的内容不做任何修改 ``(斜点) 用来执行命令• 请观察下面的命令区别 –echo "Today is date" #输出 Today is date –echo "Today is `date`" #输出 Today is 及日期 –echo Today is `date` #原样输出 Today is `date` 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  12. 12. 退出和退出状态• 在Linux执行指令,它将返回两种类型的值,用来判断此前执 行的命令或 shell 脚本成功与否。 –返回 0 ,命令执行成功 –返回任何不为 0, 命令不成功或者在执行中有一些错误• 这些值称呼为退出状态,可以通过 $? 检查退出状态 –rm nonexist-file –echo $? –ls –echo $? 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  13. 13. read 语法• read命令用来获得用户通过键盘输入的数据,并将数据保存到 变量中• 语法: read 变量1,变量2,...变量N echo "Your first name" read fname echo "Hello $fname, Lets be friend!" 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  14. 14. 通配符的使用• "*"星号代表任何的字符出现0到多次 ls /lib/*.so # 任何以 .so为后缀 ls /lib/lib*.so.* # 以lib开头+.so.+任何其他后缀• "?"问号代表一个而且只有一个任何字符 ls /lib/lib??.so.? # 此文件名长度为10• "[ ]" 括号内提供的字符选择一个 ls /lib/lib[bcp]*.so # b,c,p选一,libb,libc,libp• "[ - ]" 括号内一段字符,0-9数字,a-z小写,A-Z大写 ls /lib/lib[b-p]*.so # 从b到p选一• "[^ ]" 括号内的都排除掉 ,[^bc] 除了b和c以外的其他全部 ls /lib/lib[^c]*.so.* 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  15. 15. 一行中执行多个命令• 语法:以";"分号间隔每条命令 –命令1 ; 命令2 ; .... ; 命令N date ; who 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  16. 16. 命令行的处理• Linux绝大多数命令可以带参数和选项,请识别下面的命令带 有多少参数 #命令 #参数总数($#) ls foo #1 cp y y.bak #2 date #0 tail -10 myf #2 mail raj #1 sort -r -n myf #3 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  17. 17. 命令行参数• 根据前面观察的结果 –$# 保存着命令后面所带的参数的 总数 –$* 或者 $@ 将命令后的所有参数 作为一个字符串保存 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  18. 18. 位置参数• 观察下面的命令• 位置1处代表程序名本身由 $0 表示• 位置2,3处代表参数部分起始以 $1 ,$2 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  19. 19. shell 脚本中条件判断• 返回 Shell 中 0 (代表 True)或 1 (False) 结果 –if/then结构 –test 或者 [ ... ] 执行shell测试,返回shell结果• Bash 2.02版本以上 [[ ... ]]• 返回常规编程语言格式的结果 –(( ... )) 和 let ... 还可以做数字的比较• bc 指令提供我们对条件的测试 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  20. 20. bc指令的测试• bc指令可以用在对数学和逻辑测试 5/2 # 5 除以 2 等于 2 # Shell中返回整数 5%2 # 5 除以 2 余多少? 1 0 || 1 # 逻辑或运算 1 100 > 99 # 100 大于 99 吗? 1 # YES 99 > 100 # 99 大于 100 吗? 0 # NO quit #退出 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  21. 21. test命令或[ ]• [ ]中写入测试条件,注意条件和开/闭中括号之间要保留空格• 初学者使用此模式时,要特别注意,0代表TRUE,可以理解成 没有错误,而1代表 FALSE if [ 0 ]; then echo " 0 is true" else echo "0 is false" fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  22. 22. 测试条件• 字符的比较 数字的比较 代表意思 == -eq 相等 > -gt 大于 < -lt 小于 != -ne 不等于 <=/>= -le/ge 小于等于/大于等于Ÿ 多个条件测试时 -a 并且,逻辑与 -o 或者,逻辑或 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  23. 23. 测试文件/文件夹属性• 常见判断 -a #文件是否存在 -b #文件是否为块设备 -d #文件是否为目录 -s #文件大小是否为0 -r #文件是否具有可读权限 -w #文件是否具有可写权限 -x #文件是否具有可执行权限• man bash 可以得到更为详尽的帮助 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  24. 24. if...else...fi• 语法: if [ 条件判断 ] then 命令 1 #上面条件判断结果为0,代表TRUE 命令 2 else 命令3 #上面条件判断结果为1,代表FALSE 命令4 fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  25. 25. && 和 ||• && 与运算, || 或运算,不能使用在 [ ... ] 之间,只能使用在 [[ ... ]]之间 [ -e "/etc/passwd" && -e "/etc/group" ] –-bash: [: missing `] #提示缺少[ ]• 单独使用时, && 代表之前的条件 TRUE 时,|| 代表之前的 条件 FALSE。 [ ping -c2 $SERVER &> /dev/null ] && echo "$SERVER is online" || echo "$SERVER is down" 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  26. 26. [[ ... ]] 测试• [[ ... ]] 测试相比 [ ... ]更为实用些,这是一个扩展测试命令• 使用 [[ ... ]] 相对 [ ... ] 而言,可以防止在脚本中出现很多逻辑 上的错误信息,比如 &&,|| , < 和 >• 在 [[ ... ]] 中自动计算十进制和8/16进制的值。 decimal=15 octal=017 #八进制的数字15 hex=0x0f #16进制的数字15 if [ "$decimal" -eq $octal ] ;then echo "$decimal equal $octal" else echo "$decimal not equal $octal" fi 将上面的 [ ] 改为 [[ ]]再试试 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  27. 27. if语句的直接使用示例• if 语句可以直接使用Shell指令,再根据 $? 结果判断 DIR=/var/test if cd $DIR &> /dev/null; then #直接丢弃错误信息 echo "now in $DIR" else echo "Cant change to $DIR" fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  28. 28. if语句嵌套• 一步一步测试时,可能需要 if-then-else语句的嵌套使用 OSCH=0 echo "1. Unix (IBM AIX)" echo "2. Linux (Red Hat Enterprise Linux)" read OSCH if [ $OSCH -eq 1 ]; then echo "You pick UNIX OS" else if [ $OSCH -eq 2 ]; then echo "You pick Linux OS" else echo "What you dont Like Linux/Unix OS" fi fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  29. 29. 多级if-then-else• 多级if-then-else可以替换掉if-then-else的嵌套使用,直接 使用另一个/多个条件测试,请将之前的程序修改以下语法• 语法 if [ 测试条件 ] ;then 命令1 elif [ 测试条件2 ] ;then 命令2 elif [ 测试条件n ] ;then 命令n else 命令 fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  30. 30. exit 退出代码• SHELL下执行指令凡是不成功都返回一个不为零的值• exit函数可以实现脚本退出时返回值 if [ -e /var/spool/test.pid ]; then echo "The program already run" exit 1 fi• echo $? 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  31. 31. Shell中loop循环• 循环的定义: –计算机可以重复一而再,再而三的执行特定的指令,直到给 定的条件满足为止,重复执行的这一组指令就叫做loop• Bash中支持 –for loop –while loop• 注意每个循环使用时 ∴首先,用在循环中的变量必须要在循环前初始化 ∴对每次循环都需要对条件做测试 ∴在循环体中执行一次需要对循环测试条件值修改 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  32. 32. for loop• 语法: for 变量名 in 列表 do 循环体 done• 列表就是一个集合,集合由空格间隔,可以是以下的几种: – 数字/字符集合 • 12579 • {1..254} – 文件集合 • /etc/*.conf – 指令结果集合 • $( find /etc/ -perm -003 ) 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  33. 33. for loop实例二• 数字集合 echo "#!/bin/bash" > /bin/setFilewall.sh for IP in {1..254} do echo "iptables -I INPUT -s 192.168.0.$IP -p tcp -m state --state NEW -j ACCEPT" >> /bin/setFirewall.sh done 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  34. 34. for loop 实例二for FILE in $(find /var/ -size +10M)do rm -f $FILE logger "$FILE has been deleted" echo -e "033[33m$FILE 033[0mhas been deleted" >> /var/tmp/largefile.logdone 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  35. 35. for 循环C语言格式l 很多有过C编程基础的程序员在开始写SHELL程序的时候对 Bash程序有着很大的抱怨;l 但是Bash 2.02以后添加了(( ... )),可以提供类似C语言的语法l 在(( ... )) 中你不再需要对SHELL变量名的调用在其之前加$ (美元号) ① for (( i = 0; i <=5 ; i++ )) do echo "welcome $i times" donel 特别要注意的是此类的语法的逻辑和SHELL截然相反,0代表 FALSE,所有非0的值代表TRUE,不建议用在if-then语句中 if (( UID > 0 )); then ; echo "Welcome root"; fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  36. 36. for loop循环嵌套一for NUM1 in {1..9}do for NUM2 in {1..9} do RES = $(( NUM1 * NUM2 )) #注意此处没有调用$ echo " $NUM1 * $NUM2 = $RES" donedone#请把此代码改成C语言格式 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  37. 37. for loop循环嵌套二• 国际象棋棋盘的例子 for (( i = 1; i <= 9 ; i++ )) do for (( j = 1; j <= 9 ; j++)) do tot=$(( i+j )) tmp=$(( tot % 2 )) if [ $tmp -eq 0 ];then echo -e -n "033[47m " #白色块 else echo -e -n "033[40m " #黑色块 fi done echo -e -n "033[40m" echo #换行 done 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  38. 38. while循环• 语法: – while [ 条件测试 ] do 命令 done• 注意要修改测试条件的值,防止死循环。还可以与 if-then-fi嵌套使用,使用exit函数退出 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  39. 39. while菜单示例CHOOSE=0while [[ $CHOOSE != "Q" && $CHOOSE != "q" ]]do if (( CHOOSE !="0" )); then echo -e "Please input 033[33mq033[0m to quit" sleep 4 fi clear echo "1. Linux" echo "2. Unix" echo "Q. Quit" read CHOOSE echo "Please Input 033[33mq033[0m to quit"done 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  40. 40. case语句• case语句是 多级if-then-elif语句的替代语句。可以让你多个 值做匹配测试,更方便读写。• 语法: case 变量名 in 匹配1) 命令1;; 匹配2) 命令2;; 匹配N) 命令N;; *) 命令;; esac 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  41. 41. case语句示例PIDFILE=/var/spool/test.pidcase $1 in "start") if [ -e $PIDFILE ]; then echo "the testcase has already run" else echo $$ > $PIDFILE; echo "starting now..." fi ;; "stop") kill -9 $(cat $PIDFILE) ; rm -f $PIDFILE ;; "status") .... *) #默认值,匹配所有上面没有给定的值 echo "Usage: /etc/init.d/testcase (start|stop|status)" ;;esac 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  42. 42. 如何调试脚本• 当需要调试脚本错误时,你可以在 sh 或 bash 命令中使用 -v 和 -x 选项• 语法 –bash 选项 {shell脚本} –-v 打印shell脚本执行的行号 –-x 对每一个指令做展开计算 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  43. 43. 向 /dev/null 发送程序不想要的输出• Shell脚本程序需要过滤掉任何不想看到的因为执行Shell命令 输出的信息• 语法 –命令 > /dev/null• rm &> /dev/null 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  44. 44. 函数的使用• 函数是一系列的指令和命令• 本身不运行,可以多次调用,可以简化代码• 语法 函数 () { 命令1;命令2 return #返回值 } 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  45. 45. 函数的参数• 函数也可以作为一个程序一样运行,接收参数 –fname $arg1 $arg2 • 这和Shell中位置参数一样,我们可以对$1,$2进行测试 max ( ) { if (( $1 > $2 ));then return $1 #注意,此时函数已经结束了 fi return $2 } max 10 100 echo $? #通过 $? 取得函数的返回值 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  46. 46. 函数示例setPath ( ){ PATH=/bin:/usr/bin if (( $UID == 0 ));then #如果为root PATH=$PATH:/usr/bin/sbin:/sbin #路径追加sbin的目录 fi if (( $2 == "after" ));then #根据位置参数2,决定如何添加新路径 PATH=$PATH:$1 #在原PATH后面追加 else PATH=$1:$PATH #在原PATH之前添加 fi} 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  47. 47. I/O重定向和文件描述• Linux经常使用到的 1> ,2> , &> 重定向,各自代表着标 准输出,标准错误,以及两者都包括(1&&2)• Linux同时除以上的几个重定向外提供给我们 0-10 的其他文 件描述(File Description:FD)• 它可以用来对前者的信息做一备份,之后再重新调用其信息 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  48. 48. 重定向高级应用• >&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出; <&n 标准输入复制自文件描述符 n; <&- 关闭标准输入(键盘); >&- 关闭标准输出; n<&- 表示将 n 号输入关闭; n>&- 表示将 n 号输出关闭;• 上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定 而不是缺省的 0 或 1。如: ... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。 ... 2>&1 运行一个命令并把它的标准输出和输出合并。(通过复制文件描述 符 1 来建立文件描述符 2 ,合并了两个流。) 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  49. 49. 重定向高级应用续• 2>&1 也就是 FD2=FD1 ,把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。因为 FD2 的默认输出和 FD1的默认输出本来 都是 monitor,一样的!• exec 1>outfilename # 打开文件outfilename作为stdout。 exec 2>errfilename # 打开文件 errfilename作为 stderr。 exec 0<&- # 关闭 FD0。 exec 1>&- # 关闭 FD1。 exec 5>&- # 关闭 FD5。 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  50. 50. 重定向高级应用续• exec 3>&1;exec 4>&1 #建立FD3; 把FD3 看作最初始的FD1的硬盘备份 ss=$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep >file) 4>&1) * exec 3>&-;exec 4>&- #关闭 FD3、FD4。 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  51. 51. 用户界面和dialog工具 ①• 在文本控制台下实现用户界面,支持 多选框 表单 文件选择 进 度条 输入框 菜单 消息框 密码 单选框 文本框 YesNo 等多个 元件• 安装包 dialog• /usr/share/doc/dialog-<version>/sample 目录下提供示 例程序 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  52. 52. 用户界面和dialog工具 ②• dialog显示文本用户界面,在选择之后可以对其退出状态使用 case语句做检测• 通常为以下几种: 0 Yes 或 OK 1 No 或 Cancel 2 用户点击 Help 帮助按钮 3 点击其他的按钮 -1 Esc键退出 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  53. 53. 用户界面和dialog工具 ③• 每一次使用一种对话框元素,可以使用下面的语句清除屏幕的 同时保留原背景色 –dialog --clear –不要使用Shell命令 clear 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  54. 54. dialog工具实现消息框• cat > dia2 dialog --title "Linux Dialog Utility Msgbox" #标题头 --backtitle "Linux Shell Script #一行写不完 Tutorial" #背景左上角信息 --msgbox "This is dialog box called msgbox, which is used........." 9 50• --msgbox 消息框中的内容• 9 50 居中的长高度和款 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  55. 55. 消息框演示结果截图 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  56. 56. diglog工具实现确认框• dialog --title "Linux Dialog Utility Msgbox" --backtitle "Linux Shell• Script Tutorial" --msgbox "This is dialog box called msgbox, which is used to show some information on screen which has also Ok button, Thanks to Savio Lam and Stuart Herbert to give us this utility. Press any key. . . " 9 50 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  57. 57. 确认框演示结果截图 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  58. 58. diglog工具实现yes/no选择对话框 dialog --title "Alert : Delete File" --backtitle "Linux Shell Script Tutorial" --yesno "nDo you want to delete /usr/letters/jobapplication file" 7 60 sel=$? case $sel in 0) echo "User select to delete file";; 1) echo "User select not to delete file";; 255) echo "Canceled by user by pressing [ESC] key";; esacŸ 返回值判断用户的选择 0 代表 Yes ,1 代表 0 , 255 代表强制退出 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  59. 59. yes/no演示结果截图 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  60. 60. diglog工具实现输入框dialog --title "Inputbox - To take input from you" --backtitle "Linux Shell Script Tutorial" --inputbox "Enter your name please" 8 60 2>/tmp/input.$$ #关键部分将输入信息保存到文件中sel=$?na=$(cat /tmp/input.$$)case $sel in 0) echo "Hello $na" ;; #执行结果为0,读取文件中输入的信息 1) echo "Cancel is Press" ;; #返回结果为1,表示取消 255) echo "[ESCAPE] key pressed" ;; #255为退出esacrm -f /tmp/input.$$ 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  61. 61. 指导老师:杨坤 QQ: 12238747蓝狐教育系统培训中心 0731-84125710
  62. 62. dialog中多选框• --checklist 与Menu Box雷同,提供了多选框,同时也提供了选项的 on/off 的初始状态。• 语法 – --checklist <文本> <高> <宽> <列表的高度> [ <tag> <条目描述> <状态> ] ......• 示例: dialog --backtitle "服务列表" --title "这是一个多选框的例子" --checklist "请选择开启的服务" 20 61 5 "ntp" "Network time protocol" off "sendmail" "Sendmail mail service" oN "httpd" "Apache Web server" oFf 2>/tmp/tmp.$$Ÿ dialog的多选框返回值就是选择ON的值 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  63. 63. dialog中文件选择框• --fselect 显示一个文本窗口让你输入文件名,在此之上还有目录名和文件名 的窗口• dialog命令执行后返回用户所选文件• 语法 – --fselect <文件路径/> <高> <宽> – 示例: exec 3>&1 FILE=`dialog --title "Please choose a file" --fselect $HOME/ 14 48 2>&1 1>&3 exec 3>&- 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  64. 64. dialog进度条• dialog中可以使用loop实现动态的进度条• 语法 – dialog --gauge <文本> <高> <宽> [百分比]• 从标准输入中读取百分比的值 ( XXX ),如果没有指定缺省为0 PCT=10 ( while (( PCT != 100 )) do echo "XXX" #XXX占位符代表数字+%(百分号) echo $PCT echo "The newn message ($PCT percent)" echo "XXX" PCT=$((PCT+10)) sleep 1 done ) | dialog --title "Gauge" --gauge "Hi, this is a gauge" 20 70 0 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  65. 65. dialog中菜单• 在dialog中可以实现上下选择菜单的项• 其结果输出到一个临时文件,再将 tag 结果显示出来• 语法 – dialog --menu <文本> <高> <宽> <菜单高> [ tag 选项描述 ] ...... – 示例: dialog --clear --title "Menu Box" --menu "Hi, this is a menu box example n Choose the OS you like:" 20 51 4 "Linux" "RedHat Enterprise Linux" "UNIX" "IBM AIX" "WIN NT" "Microsoft Windows NT" 2> /tmp/temp.$$ cat /tmp/temp.$$ 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  66. 66. getopts命令• getopts用来检测命令行中传递给脚本的有效参数• 通常用在while loop中• 语法: – getopts <选项字符串> <变量1>• <选项字符串>包含了要识别的选项字符;如果字符前存在“-”(横杠), 而此选项期待着有一个参数,它们之间用空格空开。• 每次调用 getopts 的时候,它将下一选项设置给<变量1>• 当选项需要参数时,getopts 将参数设置给变量 OPTARG• 如果选项不正确,返回 ? 给<变量1> 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  67. 67. getopts示例 ::while getopts n a opt #此程序就有-n 和 -a 选项,注意选项字串尾部的冒号(:)do case "$opt" in n) name="$OPTARG";; a) age="$OPTARG";; ?) echo "Usage: ..." esacdoneecho "Welcome $name , you age is $age" 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  68. 68. • 谢谢! 任何问题请 email: yangwawa0323@163.com 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710

×