二十一、shell脚本编程-2

本文详细介绍了Shell脚本编程中的参数传递、嵌入式命令、调试技巧及特定变量的应用。通过实际案例,帮助读者理解如何高效地管理和调试脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       下面我们接着讲解shell脚本编程,主要内容如下:

        ◆ 向脚本传递参数

        ◆ shell中的嵌入式命令

        ◆ 调试shell脚本
        ◆ 在脚本中通过set传参
        ◆ 特定变量

 

一、向脚本传递参数
         通常情况下,我们在向脚本传递参数的时,最多能传递9个参数,因为shell中只能使用$1-$9,如果我们要在脚本中使用第9个 以后的参数值,那怎么办呢?幸运的是,shell提供了shift命令,能很好的解决这个问题,下面我们先一个例子:

    #example_1:No_1.sh
    #!/bin/bash

    while [ $# -ne 0 ]
    do
        echo $1
    done
    
    ./No_1.sh a b c
    a
    a
    a
    ...

 

       上面这个例子,由于无法将参数偏移到下一个参数,故执行结果为:不断的输出a
        我们加入shift命令,看一下下面这个例子:

    #example_2:No_2.sh
    #!/bin/bash

    while [ $# -ne 0 ]
    do
        echo $1
        shift
    done
    
    ./No_2.sh a b c
    a
    b
    c

    
        执行结果为a b c 符合我们的预期
   
       我们看一下shift的其他用法, 获取命令行中的最后一个参数
           ◆方式一: eval echo \$$#
           ◆方式二: shift 'expr $# -2'

 

二、shell中的嵌入式命令

 :        空,永远返回为true
 .        从当前shell中执行操作
 break    退出for、whiel、until或case语句
 cd       改变到当前目录
 continue 执行循环的下一步
 echo     反馈信息到标准输出
 eval     读取参数,执行结果命令
 exec     执行命令,但不在当前shell
 exit     退出当前shell
 export   导出变量,使当前shell可利用它
 pwd      显示当前目录
 read     从标准输入读取一行文本
 readonly 使变量只读
 return   退出函数并带有返回值
 set      控制各种参数到标准输出的显示
 shift    命令行参数向左偏移一个
 test     测试条件表达式
 times    显示shell运行过程的用户和系统时间
 trap     当捕获信号时运行指定命令
 ulimit   显示或设置shell资源
 umask    显示或设置缺省文件创建模式
 unset    从shell内存中删除变量或函数
 wait     等待直到子进程运行完毕,报告终止
 type     查询命令是否任驻留内存或命令类型;打印命令名是否有效或该命令在系统中的位置


          eg:
              tpye cd   => cd is a shell builtin
              tpye who  => who is /usr/bin/who

三、调试shell脚本
        1、循环、控制结构错误
              此种错误,通常是由于漏写固定的关键字,如do后忘了写done,if后漏写fi等
             可根据系统给出的提示,进行排错,如:

       # ./a.sh 
         ./a.sh: line 8: syntax error: unexpected end of file

        2、漏写引号
              此种错误,可根据系统提示排错,如:

       # ./a.sh 
          ./a.sh: line 6: unexpected EOF while looking for matching `"'

  
              当shell打印出错误行后,通常在vi编辑器中查看文件,可使用vi的set nu选项调试错误,步骤如下:
              a、进入vi,按ESC进入命令模式
              b、输入冒号(:),然后键入set nu
              此时系统将给vi中的文本给出行号,容易定位

 

        3、test错误
               此种错误是由于在[ 1 -eq 11 ] 忘写左边或右边的数字,或者时[]中忘记空格

        # [ 1 -eq 1]
          -bash: [: missing `]'

        4、echo
               在脚本重要部分插入echo语句,是一种比较有效的调试手段
 
        5、set命令
               set -n 读命令但不执行
               set -v 显示读取的所有行
               set -x 显示所有命令和参数
 
          例子:

# vi b.sh

 #!/bin/bash
 #error
 #set set -x

 set -x

 LIST="shenzhen guangzhou dongguan zhuhai"
 echo -n "Enter address name:"
 read NAME

 for LOOP in $LIST
 do
        if [ "$LOOP" = "$NAME" ];then
                echo "the same to address name!"
                break
        fi
 done

 #unset set -x
 set +x

         执行./a.sh ,输入不符合要求的值,输出结果如下:

+ LIST='shenzhen guangzhou dongguan zhuhai'
+ echo -n 'Enter address name:'
Enter address name:++ read NAME
chengdu
+ for LOOP in '$LIST'
+ '[' shenzhen = chengdu ']'
+ for LOOP in '$LIST'
+ '[' guangzhou = chengdu ']'
+ for LOOP in '$LIST'
+ '[' dongguan = chengdu ']'
+ for LOOP in '$LIST'
+ '[' zhuhai = chengdu ']'
+ set +x


 四、在脚本中通过set传参
         例子:

 # vi c.sh
 #!/bin/bash

 set "a" "b" "c"

 while [ $# -ne 0 ]
 do
         echo $1
         shift
 done


 #./c.sh
    a
    b
    c

 

五、特定变量

        $?:           记录上次命令执行的结果,0:代表成功;非0:代表失败
        $1 ~ $9 : 代表传递给脚本的参数名
       $#::           代表传递给脚本的参数个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值