05-Shell编程

作者: 郑元吉 | 来源:发表于2018-11-17 17:12 被阅读10次

    一、shell编程

    1.简介

    1.1什么是shell

    把在终端运行的命令保存到文件中,这个文件就是shell程序

    简单的说,shell编程就是第Linux命令的逻辑化处理

    1.2shell解析器的类型

    bash,ash,ksh等,默认使用bash

    演示命令:
    echo $SHELL
    /bin/bash
    
    1.3shell的作用

    如果需要反复执行某些Linux命令,则可以将这些命令写到一个shell脚本中,然后每次只需要运行一下这个脚本即可

    2.第一个shell程序

    2.1实现

    打开文本编辑器(可以使用 tou'ch命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好

    代码演示:

    #!/bin/bash
    #打印hello world
    echo "Hello World !"
    
    2.2运行

    方式一:作为可执行程序

    touch test.sh
    vim test.sh
    chmod +x ./test.sh
    ./test.sh
    

    方式二:作为解释器参数

    /bin/bash test.sh 
    

    3.shell中的变量

    3.1变量的定义

    定义:变量名=值

    演示命令:
    your_name="zhangsan"   #定义变量没有$,赋值符中间不允许有空格
    echo $your_name        #使用是必须有$
    num=10
    echo ${num}
    
    #注意:变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
    echo "his name is ${your_name}"
    
    3.2只读变量

    readonly:只读,将变量声明为readonly,只读变量的值不能发生改变

    myUrl="http://www.baidu.com"
    readonly myUrl
    myUrl="http://www.1000phone.com"
    
    #运行脚本,报错:/bin/sh: NAME: This variable is read only
    
    3.3删除变量

    unset:删除变量

    代码演示:
    myUrl="http://www.baidu.com"
    unset myUrl
    echo $myUrl
    
    #变量被删除后不能再次使用。unset 命令不能删除只读变量。
    #以上实例执行将没有任何输出
    

    4.字符串和数组

    4.1字符串

    双引号或者单引号

    单引号的限制:

    ​ a.单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的

    ​ b.单引号字符串中不能再出现单引号【对单引号进行转义后去不起作用】

    总结:

    ​ 双引号:可以包含除了$、`、\、‘‘之外的任意字符

    ​ 单引号:其中的任意字符都不会被解析,都会原样输出

    ​ 反引号:会将其中的内容作为命令执行

    ​ 反斜线:转义特定的字符,如:&、*、^、等

    代码演示:

    代码演示:
    #!/bin/bash
    
    #定义字符串
    your_name='qinjx'
    str="Hello, I know you are \"$your_name\"! \n"
    
    #拼接字符串
    your_name="qinjx"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting $greeting_1
    
    #获取字符串长度
    string="abcd"
    echo ${#string} #输出 4
    
    #提取子字符串
    string="1000phone is a great site"
    echo ${string:1:4}       #包头包尾,下标从0开始计数
    
    #查找子字符串
    string="1000phone is a great company"
    echo `expr index "$string" is`   #查找is在string中的位置,从1开始计数
    
    #注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦
    
    4.2数组

    bash只支持一维数组,不支持多维数组

    并没有限制数组的大小

    数组元素的下标也是从0开始的,获取数组中的元素使用下标

    定义数组:数组名=(值1 值2 值3....)

    注意:shell中的数组元素之间使用空格分隔

    代码演示:

    #数组的定义
    arr1=(10 20 30 40)
    echo $arr1
    arr2=(
    10
    20
    30
    40
    )
    echo $arr2
    
    #数组的使用
    #读取数组中的元素
    echo ${arr1[2]}
    #如果要读取数组中的全部元素
    echo ${arr2[@]}
    
    # 取得数组元素的个数
    length=${#arr1[@]}
    echo $length
    # 或者
    length=${#arr1[*]}
    echo $length
    # 取得数组单个元素的长度
    lengthn=${#arr1[3]}
    echo $lengthn
    

    5.shell中的运算符

    expr:是一款表达式计算工具,使用它能够完成表达式的求值操作(注意:计算符前后要加空格)

    代码演示:

    val=`expr 1 + 2`
    echo "两数之和为 : $val"
    
    #1.算术运算符
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a \* $b`
    echo "a * b : $val"
    
    #2.关系运算符
    ## []中,前后都需要空格
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a 等于 b"
    else
       echo "$a -eq $b: a 不等于 b"
    fi
    
    #3.逻辑运算符
    if [ 1 -lt 3 ] && [ 2 -lt 3 ]; 
    then
      echo "ok"
    fi
    

    6.echo、printf、test命令

    1>echo

    echo -e "OK! \n"      # -e 开启转义,\n 显示换行
    echo -e "OK! \c"       # -e 开启转义 \c 不换行
    
    echo `date`    #显示命令执行结果
    #注意: 这里使用的是反引号 `, 而不是单引号 '。
    #结果为:Thu Jul 24 10:08:46 CST 2014
    

    2>printf

    printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
    printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234 
    printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543 
    

    注意:

    ​ %s %d %f都是格式替换符

    ​ -10s:指的是一个宽度为10的字符(-表示左对齐,没有则表示右对齐),任何字符都会填充在这10个字符内,如果不足则使用空格自动填充

    ​ -4.2f:指的是格式化为小数,其中.2表示保留小数点后两位

    3>test

    #1.数值测试
    num1=100
    num2=100
    if test $[num1] -eq $[num2]
    then
        echo '两个数相等!'
    else
        echo '两个数不相等!'
    fi
    
    #2.字符串测试
    num1="hello"
    num2="hello11"
    if test $num1 = $num2
    then
        echo '两个字符串相等!'
    else
        echo '两个字符串不相等!'
    fi
    
    #3.文件测试
    cd /bin
    if test -e ./bash
    then
        echo '文件已存在!'
    else
        echo '文件不存在!'
    fi
    

    test命令用来监测某个条件是否成立,他可以进行数值,字符和文件的监测

    7.shell中的流程控制语句

    7.1分支语句

    if,case

    代码演示:

    #if语句
    #单分支
    if [ 1 -lt 3 ] && [ 2 -lt 3 ]; 
    then
      echo "ok"
    fi
    
    #双分支
    num1=$[2*3]
    num2=$[1+5]
    #if else语句经常与test命令结合使用
    if test $[num1] -eq $[num2]
    then
        echo '两个数字相等!'
    else
        echo '两个数字不相等!'
    fi
    
    #多分支
    a=10
    b=20
    if [ $a == $b ]
    then
       echo "a 等于 b"
    elif [ $a -gt $b ]
    then
       echo "a 大于 b"
    elif [ $a -lt $b ]
    then
       echo "a 小于 b"
    else
       echo "没有符合的条件"
    fi
    
    
    #case语句
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac
    
    7.2循环语句

    for while until

    代码演示:

    #for语句
    #需求:顺序输出当前列表中的数字
    for num in 1 2 3 4 5
    do
        echo "The value is: $num"
    done
    
    
    #需求:顺序输出字符串中的字符
    for str in 'This is a string'
    do
        echo $str
    done
    
    #需求:遍历数组中的所有元素
    a=(1 2 3)
    for x in ${a[*]}
    do 
      echo $x
    done
      
    #while语句
    #需求:输出数字1到5
    int=1
    while(( $int<=5 ))
    do
        echo $int
        let int++
    done
    
    
    #需求:求1~10之间所有整数的和
    i=1
    sum=0
    
    while [ $i -le 10 ]
    do
          sum=$[$sum+$i]
    
          i=$[$i+1]
    done
    echo $sum
    
    #until语句
    i=1
    
    until [ $i -gt 10 ]
    do
      echo $i
      ((i++))
    done
    

    8.函数

    代码演示:

    #无参无返回值
    #定义函数
    demo()
    {
      echo 'hello world'
    }
    #调用函数
    demo
    
    #有返回值
    funWithReturn(){
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo  $? # $? 表示函数的返回值
    
    #有参有返回值
    arg()
    {
      echo $1 #第一个参数
      echo $2 #第二个参数
      echo $# #参数个数
      echo $* #用字符串的形式,显示所有参数
      return 123 #只能返回数字,并且取值是0~255
    }
    
    arg 1 2
    echo $?
    

    相关文章

      网友评论

        本文标题:05-Shell编程

        本文链接:https://www.haomeiwen.com/subject/wslifqtx.html