SlideShare uma empresa Scribd logo
1 de 68
Baixar para ler offline
Linux下Bash程序开发

本教程适用于已经学习Linux指令的学员,利用
 Bash编程有助于日常服务器的管理的便捷。

编者寄予:希望多动手,开动脑筋,克服编程的恐
 惧心理,Linux下Bash编程无非就是这么几条语
         句,有志者事竟成。

         指导老师:杨坤 QQ: 12238747
       蓝狐教育系统培训中心 0731-84125710
怎样写 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
shell 中的变量
• Linux(Shell)中有两种类型的变量:
  –系统变量:由Linux系统本身维护,通常为大写的变量名

  –用户定义变量(UDV): 由用户创建和维护,通常小写

• 查看系统变量可以通过Linux指令 set 罗列出来
• 在调用变量时,在名称前加以"$"(美元符号)
  –echo $USERNAME

  –echo $HOME



                  指导老师:杨坤 QQ: 12238747
                蓝狐教育系统培训中心 0731-84125710
彩色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
彩色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
如何定义用户自己的变量
• 要定义UDV可以使用下面的语法:
 变量名=值 (注意:等号之间没有空格)

• 通过"="将右边的值赋给左边的变量
 no=10      #正确

 10=no      #错误,值必须在右边

 vech=Bus   #定义一个'vech'变量其值为'Bus'

 n= 30      #错误,等号右边存在空格

 n =20      #错误,等号左边存在空格

              指导老师:杨坤 QQ: 12238747
            蓝狐教育系统培训中心 0731-84125710
变量名的命名规则
• 变量名必须以字符或者"_"(下划线)开头
• 重复一次,"="等号两边不能有空格
• 变量名区分大小写
• 可以定义NULL值
  –vech=              #等号右边没有任何值

  –vech=""            #引号中没有任何的空格

• 在变量名中不要使用"?"(问号),"*"(星号)


                指导老师:杨坤 QQ: 12238747
              蓝狐教育系统培训中心 0731-84125710
如何打印UDV
• 要打印或调用变量时,使用下面的语法
   $变量名                 #在定义变量或赋值的时候不要"$"

 #定义变量

 vech=Bus

 #显示变量

 echo $vech

• 不要使用      echo vech ,这样只会把vech当成一个字符串的值
 打印出来,也就是在屏幕中输出 "vech"本身

                  指导老师:杨坤 QQ: 12238747
                蓝狐教育系统培训中心 0731-84125710
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
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
引号的使用
• 我们来区分一下引号
 ""(双引号)         对""做转义,对"$"的变量做解析

 ''(单引号)         其中的内容不做任何修改

 ``(斜点)          用来执行命令

• 请观察下面的命令区别
 –echo "Today is date"           #输出 Today is date

 –echo "Today is `date`"         #输出 Today is 及日期

 –echo 'Today is `date`'         #原样输出 Today is `date`

                   指导老师:杨坤 QQ: 12238747
                 蓝狐教育系统培训中心 0731-84125710
退出和退出状态
• 在Linux执行指令,它将返回两种类型的值,用来判断此前执
 行的命令或 shell 脚本成功与否。

 –返回 0 ,命令执行成功

 –返回任何不为 0, 命令不成功或者在执行中有一些错误

• 这些值称呼为退出状态,可以通过 $? 检查退出状态
 –rm nonexist-file
 –echo $?
 –ls
 –echo $?
                 指导老师:杨坤 QQ: 12238747
               蓝狐教育系统培训中心 0731-84125710
read 语法
• read命令用来获得用户通过键盘输入的数据,并将数据保存到
 变量中

• 语法: read 变量1,变量2,...变量N
  echo "Your first name"

  read fname

  echo "Hello $fname, Lets be friend!"




                    指导老师:杨坤 QQ: 12238747
                  蓝狐教育系统培训中心 0731-84125710
通配符的使用
• "*"星号代表任何的字符出现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
一行中执行多个命令
• 语法:以";"分号间隔每条命令
 –命令1 ; 命令2 ; .... ; 命令N

  date ; who




            指导老师:杨坤 QQ: 12238747
          蓝狐教育系统培训中心 0731-84125710
命令行的处理
• 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
命令行参数
• 根据前面观察的结果
 –$# 保存着命令后面所带的参数的
 总数

 –$* 或者 $@ 将命令后的所有参数
 作为一个字符串保存
         指导老师:杨坤 QQ: 12238747
       蓝狐教育系统培训中心 0731-84125710
位置参数
• 观察下面的命令
• 位置1处代表程序名本身由 $0 表示
• 位置2,3处代表参数部分起始以 $1 ,$2




              指导老师:杨坤 QQ: 12238747
            蓝狐教育系统培训中心 0731-84125710
shell 脚本中条件判断
• 返回 Shell 中 0 (代表 True)或 1 (False) 结果
   –if/then结构

   –test 或者 [ ... ] 执行shell测试,返回shell结果

• Bash 2.02版本以上 [[ ... ]]
• 返回常规编程语言格式的结果
   –(( ... )) 和 let ... 还可以做数字的比较

• bc 指令提供我们对条件的测试


                    指导老师:杨坤 QQ: 12238747
                  蓝狐教育系统培训中心 0731-84125710
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
test命令或[ ]
• [ ]中写入测试条件,注意条件和开/闭中括号之间要保留空格
• 初学者使用此模式时,要特别注意,0代表TRUE,可以理解成
 没有错误,而1代表 FALSE

 if [ 0 ]; then

      echo " 0 is true"

 else

      echo "0 is false"

 fi

                     指导老师:杨坤 QQ: 12238747
                   蓝狐教育系统培训中心 0731-84125710
测试条件
• 字符的比较     数字的比较                      代表意思
 ==         -eq                        相等
 >          -gt                        大于
 <          -lt                        小于
 !=         -ne                        不等于
 <=/>=      -le/ge          小于等于/大于等于

Ÿ 多个条件测试时
  -a 并且,逻辑与 -o 或者,逻辑或



              指导老师:杨坤 QQ: 12238747
            蓝狐教育系统培训中心 0731-84125710
测试文件/文件夹属性
• 常见判断
  -a     #文件是否存在
  -b     #文件是否为块设备
  -d     #文件是否为目录
  -s     #文件大小是否为0
  -r     #文件是否具有可读权限
  -w     #文件是否具有可写权限
  -x     #文件是否具有可执行权限
• man bash 可以得到更为详尽的帮助
              指导老师:杨坤 QQ: 12238747
            蓝狐教育系统培训中心 0731-84125710
if...else...fi
• 语法:
 if [ 条件判断 ]
 then
      命令 1     #上面条件判断结果为0,代表TRUE
      命令 2
 else
      命令3      #上面条件判断结果为1,代表FALSE
      命令4
 fi
                 指导老师:杨坤 QQ: 12238747
               蓝狐教育系统培训中心 0731-84125710
&& 和 ||
• && 与运算, || 或运算,不能使用在 [ ... ] 之间,只能使用在
 [[ ... ]]之间
  [ -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
[[ ... ]] 测试
• [[ ... ]] 测试相比 [ ... ]更为实用些,这是一个扩展测试命令
• 使用 [[ ... ]] 相对 [ ... ] 而言,可以防止在脚本中出现很多逻辑
  上的错误信息,比如 &&,|| , < 和 >
• 在 [[ ... ]] 中自动计算十进制和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
if语句的直接使用示例
• if 语句可以直接使用Shell指令,再根据 $? 结果判断
  DIR=/var/test

  if cd $DIR &> /dev/null; then               #直接丢弃错误信息

       echo "now in $DIR"

  else

       echo "Can't change to $DIR"

  fi



                     指导老师:杨坤 QQ: 12238747
                   蓝狐教育系统培训中心 0731-84125710
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 don't Like Linux/Unix OS"
       fi
  fi
                       指导老师:杨坤 QQ: 12238747
                     蓝狐教育系统培训中心 0731-84125710
多级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
exit 退出代码
• SHELL下执行指令凡是不成功都返回一个不为零的值
• exit函数可以实现脚本退出时返回值


    if [ -e /var/spool/test.pid ]; then

         echo "The program already run"

         exit 1

    fi

•   echo $?

                        指导老师:杨坤 QQ: 12238747
                      蓝狐教育系统培训中心 0731-84125710
Shell中loop循环
• 循环的定义:
  –计算机可以重复一而再,再而三的执行特定的指令,直到给
   定的条件满足为止,重复执行的这一组指令就叫做loop
• Bash中支持
  –for loop
  –while loop
• 注意每个循环使用时
  ∴首先,用在循环中的变量必须要在循环前初始化
  ∴对每次循环都需要对条件做测试
  ∴在循环体中执行一次需要对循环测试条件值修改
                  指导老师:杨坤 QQ: 12238747
                蓝狐教育系统培训中心 0731-84125710
for loop
•   语法:
      for 变量名 in 列表
      do
           循环体
      done
•   列表就是一个集合,集合由空格间隔,可以是以下的几种:
    – 数字/字符集合
      • 12579
      • {1..254}
    – 文件集合
      • /etc/*.conf
    – 指令结果集合
      • $( find /etc/ -perm -003 )

                          指导老师:杨坤 QQ: 12238747
                        蓝狐教育系统培训中心 0731-84125710
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
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.log

done



                     指导老师:杨坤 QQ: 12238747
                   蓝狐教育系统培训中心 0731-84125710
for 循环C语言格式
l 很多有过C编程基础的程序员在开始写SHELL程序的时候对
  Bash程序有着很大的抱怨;
l 但是Bash 2.02以后添加了(( ... )),可以提供类似C语言的语法
l 在(( ... )) 中你不再需要对SHELL变量名的调用在其之前加$
  (美元号)
  ① for (( i = 0; i <=5 ; i++ ))
      do
              echo "welcome $i times"
      done
l 特别要注意的是此类的语法的逻辑和SHELL截然相反,0代表
  FALSE,所有非0的值代表TRUE,不建议用在if-then语句中
    if (( UID > 0 )); then ; echo "Welcome root"; fi
                        指导老师:杨坤 QQ: 12238747
                      蓝狐教育系统培训中心 0731-84125710
for loop循环嵌套一
for NUM1 in {1..9}
do
     for NUM2 in {1..9}
     do
          RES = $(( NUM1 * NUM2 ))           #注意此处没有调用$

          echo " $NUM1 * $NUM2 = $RES"
     done
done
#请把此代码改成C语言格式
                    指导老师:杨坤 QQ: 12238747
                  蓝狐教育系统培训中心 0731-84125710
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
while循环
• 语法:
 – while [ 条件测试 ]
  do
        命令
  done



• 注意要修改测试条件的值,防止死循环。还可以与
 if-then-fi嵌套使用,使用exit函数退出

                 指导老师:杨坤 QQ: 12238747
               蓝狐教育系统培训中心 0731-84125710
while菜单示例
CHOOSE=0
while [[ $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
case语句
• case语句是 多级if-then-elif语句的替代语句。可以让你多个
 值做匹配测试,更方便读写。

• 语法:
  case 变量名 in
     匹配1)   命令1;;
     匹配2)   命令2;;
     匹配N)   命令N;;
     *)         命令;;
  esac
                    指导老师:杨坤 QQ: 12238747
                  蓝狐教育系统培训中心 0731-84125710
case语句示例
PIDFILE=/var/spool/test.pid
case $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
如何调试脚本
• 当需要调试脚本错误时,你可以在 sh 或 bash 命令中使用 -v
 和 -x 选项

• 语法
  –bash 选项 {shell脚本}

  –-v 打印shell脚本执行的行号

  –-x 对每一个指令做展开计算




                指导老师:杨坤 QQ: 12238747
              蓝狐教育系统培训中心 0731-84125710
向 /dev/null 发送程序不想要的输出

• Shell脚本程序需要过滤掉任何不想看到的因为执行Shell命令
  输出的信息

• 语法
  –命令 > /dev/null

• rm &> /dev/null




                      指导老师:杨坤 QQ: 12238747
                    蓝狐教育系统培训中心 0731-84125710
函数的使用
• 函数是一系列的指令和命令
• 本身不运行,可以多次调用,可以简化代码
• 语法
  函数 ()
  {
       命令1;命令2
          return           #返回值
  }

                     指导老师:杨坤 QQ: 12238747
                   蓝狐教育系统培训中心 0731-84125710
函数的参数
• 函数也可以作为一个程序一样运行,接收参数
 –fname $arg1 $arg2

     • 这和Shell中位置参数一样,我们可以对$1,$2进行测试

 max ( )
 {
     if (( $1 > $2 ));then
               return $1                #注意,此时函数已经结束了
     fi
     return $2
 }
 max 10 100
 echo $?                #通过 $? 取得函数的返回值

                          指导老师:杨坤 QQ: 12238747
                        蓝狐教育系统培训中心 0731-84125710
函数示例
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
I/O重定向和文件描述
• Linux经常使用到的 1> ,2> , &> 重定向,各自代表着标
 准输出,标准错误,以及两者都包括(1&&2)

• Linux同时除以上的几个重定向外提供给我们 0-10 的其他文
 件描述(File Description:FD)

• 它可以用来对前者的信息做一备份,之后再重新调用其信息




                指导老师:杨坤 QQ: 12238747
              蓝狐教育系统培训中心 0731-84125710
重定向高级应用
• >&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
 <&n 标准输入复制自文件描述符 n;
 <&- 关闭标准输入(键盘);
 >&- 关闭标准输出;
 n<&- 表示将 n 号输入关闭;
 n>&- 表示将 n 号输出关闭;
• 上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定
 而不是缺省的 0 或 1。如:
 ... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。
 ... 2>&1 运行一个命令并把它的标准输出和输出合并。(通过复制文件描述
 符 1 来建立文件描述符 2 ,合并了两个流。)

                 指导老师:杨坤 QQ: 12238747
               蓝狐教育系统培训中心 0731-84125710
重定向高级应用续
• 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
重定向高级应用续
• 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
用户界面和dialog工具 ①
• 在文本控制台下实现用户界面,支持 多选框 表单 文件选择 进
  度条 输入框 菜单 消息框 密码 单选框 文本框 YesNo 等多个
  元件

• 安装包 dialog
• /usr/share/doc/dialog-<version>/sample 目录下提供示
  例程序




                  指导老师:杨坤 QQ: 12238747
                蓝狐教育系统培训中心 0731-84125710
用户界面和dialog工具 ②
• dialog显示文本用户界面,在选择之后可以对其退出状态使用
 case语句做检测

• 通常为以下几种:
   0     Yes 或 OK

   1     No 或 Cancel

   2     用户点击 Help 帮助按钮

   3     点击其他的按钮

   -1    Esc键退出

                指导老师:杨坤 QQ: 12238747
              蓝狐教育系统培训中心 0731-84125710
用户界面和dialog工具 ③
• 每一次使用一种对话框元素,可以使用下面的语句清除屏幕的
 同时保留原背景色

 –dialog --clear

 –不要使用Shell命令 clear




                     指导老师:杨坤 QQ: 12238747
                   蓝狐教育系统培训中心 0731-84125710
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
消息框演示结果截图




   指导老师:杨坤 QQ: 12238747
 蓝狐教育系统培训中心 0731-84125710
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
确认框演示结果截图




   指导老师:杨坤 QQ: 12238747
 蓝狐教育系统培训中心 0731-84125710
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
yes/no演示结果截图




   指导老师:杨坤 QQ: 12238747
 蓝狐教育系统培训中心 0731-84125710
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为退出
esac
rm -f /tmp/input.$$

                            指导老师:杨坤 QQ: 12238747
                          蓝狐教育系统培训中心 0731-84125710
指导老师:杨坤 QQ: 12238747
蓝狐教育系统培训中心 0731-84125710
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
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
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
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
getopts命令
• getopts用来检测命令行中传递给脚本的有效参数
• 通常用在while loop中
• 语法:
  – getopts <选项字符串> <变量1>
• <选项字符串>包含了要识别的选项字符;如果字符前存在“-”(横杠),
  而此选项期待着有一个参数,它们之间用空格空开。
• 每次调用 getopts 的时候,它将下一选项设置给<变量1>
• 当选项需要参数时,getopts 将参数设置给变量 OPTARG
• 如果选项不正确,返回 ? 给<变量1>



                      指导老师:杨坤 QQ: 12238747
                    蓝狐教育系统培训中心 0731-84125710
getopts示例
                 ::
while getopts n a opt #此程序就有-n 和
 -a 选项,注意选项字串尾部的冒号(:)
do
     case "$opt" in
      n)    name="$OPTARG";;
      a)    age="$OPTARG";;
      ?)   echo "Usage: ..."
     esac
done
echo "Welcome $name , you age is $age"

                    指导老师:杨坤 QQ: 12238747
                  蓝狐教育系统培训中心 0731-84125710
•




            谢谢!
       任何问题请 email:
    yangwawa0323@163.com

           指导老师:杨坤 QQ: 12238747
         蓝狐教育系统培训中心 0731-84125710

Mais conteúdo relacionado

Mais procurados

Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source CodeBo-Yi Wu
 
系統程式 -- 第 11 章
系統程式 -- 第 11 章系統程式 -- 第 11 章
系統程式 -- 第 11 章鍾誠 陳鍾誠
 
Pl 06 p10.prn
Pl 06 p10.prnPl 06 p10.prn
Pl 06 p10.prnjokertest
 
2, bash synax simplified
2, bash synax simplified2, bash synax simplified
2, bash synax simplifiedted-xu
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7Justin Lin
 
5, sed
5, sed5, sed
5, sedted-xu
 
自然语言处理 中文分词程序实验报告%28含源代码%29
自然语言处理 中文分词程序实验报告%28含源代码%29自然语言处理 中文分词程序实验报告%28含源代码%29
自然语言处理 中文分词程序实验报告%28含源代码%29aemoe
 
系統程式 -- 第 12 章
系統程式 -- 第 12 章系統程式 -- 第 12 章
系統程式 -- 第 12 章鍾誠 陳鍾誠
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享Chong-Kuan Chen
 
PHPUnit 入門介紹
PHPUnit 入門介紹PHPUnit 入門介紹
PHPUnit 入門介紹Jace Ju
 
OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IHung-yu Lin
 
Python learn guide
Python learn guidePython learn guide
Python learn guiderobin yang
 
少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月鍾誠 陳鍾誠
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closureswang hongjiang
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniterBo-Yi Wu
 
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器鍾誠 陳鍾誠
 

Mais procurados (20)

Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source Code
 
系統程式 -- 第 11 章
系統程式 -- 第 11 章系統程式 -- 第 11 章
系統程式 -- 第 11 章
 
Pl 06 p10.prn
Pl 06 p10.prnPl 06 p10.prn
Pl 06 p10.prn
 
PHP
PHPPHP
PHP
 
2, bash synax simplified
2, bash synax simplified2, bash synax simplified
2, bash synax simplified
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
 
5, sed
5, sed5, sed
5, sed
 
自然语言处理 中文分词程序实验报告%28含源代码%29
自然语言处理 中文分词程序实验报告%28含源代码%29自然语言处理 中文分词程序实验报告%28含源代码%29
自然语言处理 中文分词程序实验报告%28含源代码%29
 
系統程式 -- 第 12 章
系統程式 -- 第 12 章系統程式 -- 第 12 章
系統程式 -- 第 12 章
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
PHPUnit 入門介紹
PHPUnit 入門介紹PHPUnit 入門介紹
PHPUnit 入門介紹
 
OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part I
 
Python learn guide
Python learn guidePython learn guide
Python learn guide
 
少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月
 
functional-scala
functional-scalafunctional-scala
functional-scala
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
 
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
 

Destaque

eGovernment and Interoperability in Italy
eGovernment and Interoperability in ItalyeGovernment and Interoperability in Italy
eGovernment and Interoperability in ItalyGianmarco Piva
 
HotHouse Mobile Here & Now
HotHouse Mobile Here & NowHotHouse Mobile Here & Now
HotHouse Mobile Here & NowVictoria Kerr
 
Health& Safety and Protection: Meeting Your Responsibilities
Health& Safety and Protection: Meeting Your ResponsibilitiesHealth& Safety and Protection: Meeting Your Responsibilities
Health& Safety and Protection: Meeting Your ResponsibilitiesLiz Yardley
 
D1090 getting your message across - social media - the new revolution (16 f...
D1090   getting your message across - social media - the new revolution (16 f...D1090   getting your message across - social media - the new revolution (16 f...
D1090 getting your message across - social media - the new revolution (16 f...Liz Yardley
 
D1090 h&s presentation October_2014
D1090 h&s presentation October_2014D1090 h&s presentation October_2014
D1090 h&s presentation October_2014Liz Yardley
 
Retos de la ciencia para el siglo XXI
Retos de la ciencia  para  el  siglo XXIRetos de la ciencia  para  el  siglo XXI
Retos de la ciencia para el siglo XXIMaura Salcedo
 
Laboratorio di Informatica - PHP
Laboratorio di Informatica - PHPLaboratorio di Informatica - PHP
Laboratorio di Informatica - PHPGianmarco Piva
 
Abridged Compliance Seminar for 1090 club members May 2016
Abridged Compliance Seminar for 1090 club members May 2016Abridged Compliance Seminar for 1090 club members May 2016
Abridged Compliance Seminar for 1090 club members May 2016Liz Yardley
 
Catálogo de navarrakaztelu
Catálogo de navarrakazteluCatálogo de navarrakaztelu
Catálogo de navarrakazteluNAVARRAKAZTELU
 
Metros Suecia Korea Moscu
Metros Suecia Korea MoscuMetros Suecia Korea Moscu
Metros Suecia Korea MoscuCris Araújo
 
Lego Sesso
Lego SessoLego Sesso
Lego Sessoseddik88
 
Prezentacia himalayska sol
Prezentacia   himalayska solPrezentacia   himalayska sol
Prezentacia himalayska solDeyana Petrova
 
Apostila de seguranca_do_trabalho
Apostila de seguranca_do_trabalhoApostila de seguranca_do_trabalho
Apostila de seguranca_do_trabalhobrenzink
 
Шударга Ёсыг Бадраах Сан
Шударга Ёсыг Бадраах СанШударга Ёсыг Бадраах Сан
Шударга Ёсыг Бадраах СанEnkhbayasgalan Paragon
 
căn hộ chung cư quận gò váp giá rẻ
căn hộ chung cư quận gò váp giá rẻcăn hộ chung cư quận gò váp giá rẻ
căn hộ chung cư quận gò váp giá rẻbatdongsan
 

Destaque (20)

eGovernment and Interoperability in Italy
eGovernment and Interoperability in ItalyeGovernment and Interoperability in Italy
eGovernment and Interoperability in Italy
 
HotHouse Mobile Here & Now
HotHouse Mobile Here & NowHotHouse Mobile Here & Now
HotHouse Mobile Here & Now
 
Health& Safety and Protection: Meeting Your Responsibilities
Health& Safety and Protection: Meeting Your ResponsibilitiesHealth& Safety and Protection: Meeting Your Responsibilities
Health& Safety and Protection: Meeting Your Responsibilities
 
D1090 getting your message across - social media - the new revolution (16 f...
D1090   getting your message across - social media - the new revolution (16 f...D1090   getting your message across - social media - the new revolution (16 f...
D1090 getting your message across - social media - the new revolution (16 f...
 
D1090 h&s presentation October_2014
D1090 h&s presentation October_2014D1090 h&s presentation October_2014
D1090 h&s presentation October_2014
 
Retos de la ciencia para el siglo XXI
Retos de la ciencia  para  el  siglo XXIRetos de la ciencia  para  el  siglo XXI
Retos de la ciencia para el siglo XXI
 
Laboratorio di Informatica - PHP
Laboratorio di Informatica - PHPLaboratorio di Informatica - PHP
Laboratorio di Informatica - PHP
 
Abridged Compliance Seminar for 1090 club members May 2016
Abridged Compliance Seminar for 1090 club members May 2016Abridged Compliance Seminar for 1090 club members May 2016
Abridged Compliance Seminar for 1090 club members May 2016
 
Catálogo de navarrakaztelu
Catálogo de navarrakazteluCatálogo de navarrakaztelu
Catálogo de navarrakaztelu
 
Metros Suecia Korea Moscu
Metros Suecia Korea MoscuMetros Suecia Korea Moscu
Metros Suecia Korea Moscu
 
Lego Sesso
Lego SessoLego Sesso
Lego Sesso
 
Lgr11och ikt
Lgr11och iktLgr11och ikt
Lgr11och ikt
 
Prezentacia himalayska sol
Prezentacia   himalayska solPrezentacia   himalayska sol
Prezentacia himalayska sol
 
Apostila de seguranca_do_trabalho
Apostila de seguranca_do_trabalhoApostila de seguranca_do_trabalho
Apostila de seguranca_do_trabalho
 
6 censimento
6 censimento6 censimento
6 censimento
 
Ref. 160
Ref. 160Ref. 160
Ref. 160
 
9 may
9 may9 may
9 may
 
Epistola do carmelo final
Epistola do carmelo finalEpistola do carmelo final
Epistola do carmelo final
 
Шударга Ёсыг Бадраах Сан
Шударга Ёсыг Бадраах СанШударга Ёсыг Бадраах Сан
Шударга Ёсыг Бадраах Сан
 
căn hộ chung cư quận gò váp giá rẻ
căn hộ chung cư quận gò váp giá rẻcăn hộ chung cư quận gò váp giá rẻ
căn hộ chung cư quận gò váp giá rẻ
 

Semelhante a Bash入门基础篇

Bash shell script 教學
Bash shell script 教學Bash shell script 教學
Bash shell script 教學Ming-Sian Lin
 
6, awk
6, awk6, awk
6, awkted-xu
 
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)Chu-Siang Lai
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 
02.python基础
02.python基础02.python基础
02.python基础modou li
 
Talking about exploit writing
Talking about exploit writingTalking about exploit writing
Talking about exploit writingsbha0909
 
實踐大學教案20140329
實踐大學教案20140329實踐大學教案20140329
實踐大學教案20140329Mu-Fan Teng
 
Effective linux.1.(commandline)
Effective linux.1.(commandline)Effective linux.1.(commandline)
Effective linux.1.(commandline)wang hongjiang
 
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程kidmany2001
 
Continuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIContinuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIChu-Siang Lai
 
Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)Drake Huang
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Derek Lee
 
Ruby程式語言入門導覽
Ruby程式語言入門導覽Ruby程式語言入門導覽
Ruby程式語言入門導覽Mu-Fan Teng
 
程式設計師的自我修養 Chapter 10 記憶體
程式設計師的自我修養 Chapter 10 記憶體程式設計師的自我修養 Chapter 10 記憶體
程式設計師的自我修養 Chapter 10 記憶體Shu-Yu Fu
 
3, operators
3, operators3, operators
3, operatorsted-xu
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試Wen-Tien Chang
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用Robert Hao
 
Python速成指南
Python速成指南Python速成指南
Python速成指南March Liu
 
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)永立 連
 

Semelhante a Bash入门基础篇 (20)

Bash shell script 教學
Bash shell script 教學Bash shell script 教學
Bash shell script 教學
 
6, awk
6, awk6, awk
6, awk
 
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
02.python基础
02.python基础02.python基础
02.python基础
 
Talking about exploit writing
Talking about exploit writingTalking about exploit writing
Talking about exploit writing
 
實踐大學教案20140329
實踐大學教案20140329實踐大學教案20140329
實踐大學教案20140329
 
Effective linux.1.(commandline)
Effective linux.1.(commandline)Effective linux.1.(commandline)
Effective linux.1.(commandline)
 
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程
 
Continuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIContinuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CI
 
Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18
 
Ruby程式語言入門導覽
Ruby程式語言入門導覽Ruby程式語言入門導覽
Ruby程式語言入門導覽
 
程式設計師的自我修養 Chapter 10 記憶體
程式設計師的自我修養 Chapter 10 記憶體程式設計師的自我修養 Chapter 10 記憶體
程式設計師的自我修養 Chapter 10 記憶體
 
3, operators
3, operators3, operators
3, operators
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用
 
Python速成指南
Python速成指南Python速成指南
Python速成指南
 
第五章
第五章第五章
第五章
 
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
 

Bash入门基础篇

  • 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. shell 中的变量 • Linux(Shell)中有两种类型的变量: –系统变量:由Linux系统本身维护,通常为大写的变量名 –用户定义变量(UDV): 由用户创建和维护,通常小写 • 查看系统变量可以通过Linux指令 set 罗列出来 • 在调用变量时,在名称前加以"$"(美元符号) –echo $USERNAME –echo $HOME 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 彩色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. 如何定义用户自己的变量 • 要定义UDV可以使用下面的语法: 变量名=值 (注意:等号之间没有空格) • 通过"="将右边的值赋给左边的变量 no=10 #正确 10=no #错误,值必须在右边 vech=Bus #定义一个'vech'变量其值为'Bus' n= 30 #错误,等号右边存在空格 n =20 #错误,等号左边存在空格 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 7. 变量名的命名规则 • 变量名必须以字符或者"_"(下划线)开头 • 重复一次,"="等号两边不能有空格 • 变量名区分大小写 • 可以定义NULL值 –vech= #等号右边没有任何值 –vech="" #引号中没有任何的空格 • 在变量名中不要使用"?"(问号),"*"(星号) 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 8. 如何打印UDV • 要打印或调用变量时,使用下面的语法 $变量名 #在定义变量或赋值的时候不要"$" #定义变量 vech=Bus #显示变量 echo $vech • 不要使用 echo vech ,这样只会把vech当成一个字符串的值 打印出来,也就是在屏幕中输出 "vech"本身 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 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. 引号的使用 • 我们来区分一下引号 ""(双引号) 对""做转义,对"$"的变量做解析 ''(单引号) 其中的内容不做任何修改 ``(斜点) 用来执行命令 • 请观察下面的命令区别 –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. 退出和退出状态 • 在Linux执行指令,它将返回两种类型的值,用来判断此前执 行的命令或 shell 脚本成功与否。 –返回 0 ,命令执行成功 –返回任何不为 0, 命令不成功或者在执行中有一些错误 • 这些值称呼为退出状态,可以通过 $? 检查退出状态 –rm nonexist-file –echo $? –ls –echo $? 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 13. read 语法 • read命令用来获得用户通过键盘输入的数据,并将数据保存到 变量中 • 语法: read 变量1,变量2,...变量N echo "Your first name" read fname echo "Hello $fname, Lets be friend!" 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 一行中执行多个命令 • 语法:以";"分号间隔每条命令 –命令1 ; 命令2 ; .... ; 命令N date ; who 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 命令行参数 • 根据前面观察的结果 –$# 保存着命令后面所带的参数的 总数 –$* 或者 $@ 将命令后的所有参数 作为一个字符串保存 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 18. 位置参数 • 观察下面的命令 • 位置1处代表程序名本身由 $0 表示 • 位置2,3处代表参数部分起始以 $1 ,$2 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 19. shell 脚本中条件判断 • 返回 Shell 中 0 (代表 True)或 1 (False) 结果 –if/then结构 –test 或者 [ ... ] 执行shell测试,返回shell结果 • Bash 2.02版本以上 [[ ... ]] • 返回常规编程语言格式的结果 –(( ... )) 和 let ... 还可以做数字的比较 • bc 指令提供我们对条件的测试 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. test命令或[ ] • [ ]中写入测试条件,注意条件和开/闭中括号之间要保留空格 • 初学者使用此模式时,要特别注意,0代表TRUE,可以理解成 没有错误,而1代表 FALSE if [ 0 ]; then echo " 0 is true" else echo "0 is false" fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 22. 测试条件 • 字符的比较 数字的比较 代表意思 == -eq 相等 > -gt 大于 < -lt 小于 != -ne 不等于 <=/>= -le/ge 小于等于/大于等于 Ÿ 多个条件测试时 -a 并且,逻辑与 -o 或者,逻辑或 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 23. 测试文件/文件夹属性 • 常见判断 -a #文件是否存在 -b #文件是否为块设备 -d #文件是否为目录 -s #文件大小是否为0 -r #文件是否具有可读权限 -w #文件是否具有可写权限 -x #文件是否具有可执行权限 • man bash 可以得到更为详尽的帮助 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 24. if...else...fi • 语法: if [ 条件判断 ] then 命令 1 #上面条件判断结果为0,代表TRUE 命令 2 else 命令3 #上面条件判断结果为1,代表FALSE 命令4 fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. [[ ... ]] 测试 • [[ ... ]] 测试相比 [ ... ]更为实用些,这是一个扩展测试命令 • 使用 [[ ... ]] 相对 [ ... ] 而言,可以防止在脚本中出现很多逻辑 上的错误信息,比如 &&,|| , < 和 > • 在 [[ ... ]] 中自动计算十进制和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. if语句的直接使用示例 • if 语句可以直接使用Shell指令,再根据 $? 结果判断 DIR=/var/test if cd $DIR &> /dev/null; then #直接丢弃错误信息 echo "now in $DIR" else echo "Can't change to $DIR" fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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 don't Like Linux/Unix OS" fi fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. exit 退出代码 • SHELL下执行指令凡是不成功都返回一个不为零的值 • exit函数可以实现脚本退出时返回值 if [ -e /var/spool/test.pid ]; then echo "The program already run" exit 1 fi • echo $? 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 31. Shell中loop循环 • 循环的定义: –计算机可以重复一而再,再而三的执行特定的指令,直到给 定的条件满足为止,重复执行的这一组指令就叫做loop • Bash中支持 –for loop –while loop • 注意每个循环使用时 ∴首先,用在循环中的变量必须要在循环前初始化 ∴对每次循环都需要对条件做测试 ∴在循环体中执行一次需要对循环测试条件值修改 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 32. for loop • 语法: for 变量名 in 列表 do 循环体 done • 列表就是一个集合,集合由空格间隔,可以是以下的几种: – 数字/字符集合 • 12579 • {1..254} – 文件集合 • /etc/*.conf – 指令结果集合 • $( find /etc/ -perm -003 ) 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 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.log done 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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" done l 特别要注意的是此类的语法的逻辑和SHELL截然相反,0代表 FALSE,所有非0的值代表TRUE,不建议用在if-then语句中 if (( UID > 0 )); then ; echo "Welcome root"; fi 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 36. for loop循环嵌套一 for NUM1 in {1..9} do for NUM2 in {1..9} do RES = $(( NUM1 * NUM2 )) #注意此处没有调用$ echo " $NUM1 * $NUM2 = $RES" done done #请把此代码改成C语言格式 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. while循环 • 语法: – while [ 条件测试 ] do 命令 done • 注意要修改测试条件的值,防止死循环。还可以与 if-then-fi嵌套使用,使用exit函数退出 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 39. while菜单示例 CHOOSE=0 while [[ $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. case语句 • case语句是 多级if-then-elif语句的替代语句。可以让你多个 值做匹配测试,更方便读写。 • 语法: case 变量名 in 匹配1) 命令1;; 匹配2) 命令2;; 匹配N) 命令N;; *) 命令;; esac 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 41. case语句示例 PIDFILE=/var/spool/test.pid case $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. 如何调试脚本 • 当需要调试脚本错误时,你可以在 sh 或 bash 命令中使用 -v 和 -x 选项 • 语法 –bash 选项 {shell脚本} –-v 打印shell脚本执行的行号 –-x 对每一个指令做展开计算 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 43. 向 /dev/null 发送程序不想要的输出 • Shell脚本程序需要过滤掉任何不想看到的因为执行Shell命令 输出的信息 • 语法 –命令 > /dev/null • rm &> /dev/null 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 44. 函数的使用 • 函数是一系列的指令和命令 • 本身不运行,可以多次调用,可以简化代码 • 语法 函数 () { 命令1;命令2 return #返回值 } 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 函数示例 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. I/O重定向和文件描述 • Linux经常使用到的 1> ,2> , &> 重定向,各自代表着标 准输出,标准错误,以及两者都包括(1&&2) • Linux同时除以上的几个重定向外提供给我们 0-10 的其他文 件描述(File Description:FD) • 它可以用来对前者的信息做一备份,之后再重新调用其信息 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 重定向高级应用续 • 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. 重定向高级应用续 • 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. 用户界面和dialog工具 ① • 在文本控制台下实现用户界面,支持 多选框 表单 文件选择 进 度条 输入框 菜单 消息框 密码 单选框 文本框 YesNo 等多个 元件 • 安装包 dialog • /usr/share/doc/dialog-<version>/sample 目录下提供示 例程序 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 52. 用户界面和dialog工具 ② • dialog显示文本用户界面,在选择之后可以对其退出状态使用 case语句做检测 • 通常为以下几种: 0 Yes 或 OK 1 No 或 Cancel 2 用户点击 Help 帮助按钮 3 点击其他的按钮 -1 Esc键退出 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 53. 用户界面和dialog工具 ③ • 每一次使用一种对话框元素,可以使用下面的语句清除屏幕的 同时保留原背景色 –dialog --clear –不要使用Shell命令 clear 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 消息框演示结果截图 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 确认框演示结果截图 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. yes/no演示结果截图 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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为退出 esac rm -f /tmp/input.$$ 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 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. 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. 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. 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. getopts命令 • getopts用来检测命令行中传递给脚本的有效参数 • 通常用在while loop中 • 语法: – getopts <选项字符串> <变量1> • <选项字符串>包含了要识别的选项字符;如果字符前存在“-”(横杠), 而此选项期待着有一个参数,它们之间用空格空开。 • 每次调用 getopts 的时候,它将下一选项设置给<变量1> • 当选项需要参数时,getopts 将参数设置给变量 OPTARG • 如果选项不正确,返回 ? 给<变量1> 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 67. getopts示例 :: while getopts n a opt #此程序就有-n 和 -a 选项,注意选项字串尾部的冒号(:) do case "$opt" in n) name="$OPTARG";; a) age="$OPTARG";; ?) echo "Usage: ..." esac done echo "Welcome $name , you age is $age" 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710
  • 68. 谢谢! 任何问题请 email: yangwawa0323@163.com 指导老师:杨坤 QQ: 12238747 蓝狐教育系统培训中心 0731-84125710