美文网首页
Shell 编程基础

Shell 编程基础

作者: 芝兰之室也 | 来源:发表于2021-08-01 17:28 被阅读0次

    概念:

    实际上是一个应用程序,是人与Unix系统进行交互的接口;编写脚本时,也可以理解成一种命令语言或者程序语言。

    Shell种类:

    Shell应用程序

    Shell脚本编程不需要额外的安装编译器,它可以直接用编辑器直接编辑,然后直接在Shell上直接运行即可。通常,我们在编写脚本时,在第一行需要用#!来指定解释器来运行Shell脚本,比如,#!/bin/sh。

    1、变量定义

    (1) 变量的默认数据类型是字符串类型;
    (2) 等号=和变量及被赋的值之间不能有空格;
    (3) 数据运算用$[运算表达式]形式;

    2、字符串操作

    • 获取字符串的长度:${#变量};
    • 截取字符串:${变量:x:y};
    • 替换字符串中子字符串:${变量/子字符串/替换的字符串};
    • 删除字符串中的子字符串:可以通过替换子字符串的方法实现,${变量/子字符串/};;
    • 字符串大小写替换:^^转换成大写;,,转换成小写;
    #!/bin/bash
    a="Hello World"
    echo ${#a} #获取字符串长度
    echo ${a:6:3} #从下标6开始截取3字
    echo ${a/ll/hh} #将字符串中的ll替换为hh
    echo ${a/or/} #删除子字符串or
    echo ${a^^} #全部转化成大写
    echo ${a,,} #全部转化成小写
    

    3、数字运算
    命令方式主要有let declare expr等命令;

    let 命名后直接跟上运算表达式即可:

    a="4"
    b="2"
    let c1=${a}+${b}
    echo "a + b =" ${c1}
    

    expr 注意两点:

    • 运算符和两边的变量需要使用空格隔开;
    • 需要注意需要将*转义为*。
    #!/bin/sh
    a=4
    b=2
    c1=$(expr ${a} + ${b})
    echo "a + b =" ${c1}
    

    declare -i ,将变量声明为整数型:

    #!/bin/sh
    a="4"
    b="2"
    declare -i c1=${a}+${b}
    echo "a + b =" ${c1}
    

    自增自减:

    let c1++
    echo "c1 =" ${c1}
    

    小数运算:在默认情况下shell是不支持小数运算,可以借助Linux平台下的bc计算器进行小数运算。

    a=1.411
    b=1.332
    
    c1=`echo "$a+$b"|bc`
    c4=`echo "scale=3;$a/$b"|bc` #scale用来指定小数的位数
    
    echo $c1
    echo $c4
    

    4、数组

    • 声明数组:array=(value1 value2 value3 ...)
    • 访问元素:array[0]
    • 访问所有元素:array[*] 或者 array[@]
    • 获取数组长度:#array[*] 或者 #array[@]
    a=(hello world code)
    echo ${a[0]}
    echo ${a[1]}
    echo ${a[2]}
    
    echo ${a[*]}
    echo ${a[@]}
    
    echo ${#a[*]}
    

    5、数值关系运算

    • 等于:-eq,equal
    • 不等:-ne,not equal
    • 大于:-gt,greater than
    • 小于:-lt,less than
    • 大于等于:-ge,greater equal
    • 小于等于:-le,less equal

    注意:
    中括号两边是有空格隔开,运算符和变量之间也有空格隔开

    #!/bin/sh
    a=1
    b=2
    
    if [ $a -eq $b ];then
     echo "yes"
    else
     echo "no"
    fi
    

    6、字符串关系元算

    • =:判断两个字符串是否相等,相等则为真,
      [ $a = $b ]
    • != 判断两个字符串是否不相等,不相则为真,
      [ $a != $b ]
    • -z 判断字符串长度是否为0,如果是则为真,
      [ -z $a ]
    • -n 判断字符串长度是否不为0,如果是则为真,
      [ -n "$a" ]
    • 美元符号判断字符串是否为空,如果不为空则为真,[ -n "$a" ]
    #!/bin/sh
    a="hello"
    b="hello"
    
    echo "a = b ?"
    if [ $a = $b ];then
     echo "yes"
    else
     echo "no"
    fi
    

    7、逻辑运算

    • 与:&&
    • 或:||

    8、条件语句

    • if else then elif fi 语句
    a=2
    
    if [ $a == 1 ];then
        echo "a = 1"
    elif [ $a == 2 ];then
     echo "a = 2"
    else
     echo $a
    fi
    
    • case in esac 语句
    #!/bin/sh
    
    read -p "please in put a number:" num
    
    case $num in 
    "1")
     echo "Start 1th flow"
     ;;
    "2")
     echo "Start 2th flow"
     ;;
    *)
     echo "Do nothing"
    esac
    

    9、循环语句

    • for
    a=("hello" "world" "hello" "shell")
    
    for((i=0;i<4;i++))
    do 
     echo ${a[i]}
    done
    
    a=("hello" "world" "hello" "shell")
    
    for v in ${a[*]}
    do 
     echo $v
    done
    
    • while
    a=("hello" "world" "hello" "shell")
    i=0
    
    while [ $i -lt 4 ]
    do 
     echo ${a[i]}
     let i++
    done
    

    与while循环恰好相反的循环until循环,在until循环中条件表达式不成立才会进入循环。

    • until
    a=("hello" "world" "hello" "shell")
    i=0
    
    until [ $i -ge 4 ]
    do 
     echo ${a[i]}
     let i++
    done
    

    对于until循环语句来说,一般没有上面的几种循环语句较为常用。

    • select
      特殊的循环select,每行打印前面都有一个序号,通常和case...in语句一起使用。
    a=("公司A" "公司B" "公司C" "公司D")
    
    select v in ${a[*]}
    do
     case $v in 
      "公司A")
       echo "恭喜您,你选择了公司A !"
       break
       ;;
      "公司B")
       echo "恭喜您,你选择了公司B !"
       break
       ;;
      "公司C")
       echo "恭喜您,你选择了公司C !"
       break
       ;;
      "公司D")
       echo "恭喜您,你选择了公司D !"
       break
       ;;
      *)
       echo "您没有选择任何一个公司,请重新选择!"
      esac
    done
    

    10、函数

    function test1() {
     echo "this is a function"
     return 0
    }
    
    test1 #调用函数
    

    输入参数:

    function test2() {
     echo "parameter1 : $1"
     echo "parameter2 : $2"
     return 3
    }
    
    test2 1 2 #调用函数
    echo $? #获取函数返回值
    
    • 函数名中是不要定义形参的,在调用时在函数后面加上实参就可以了。
    • 函数体中可以通过$加参数编号访问参数,比如,第一个参数$1,到第十个参数以上就需要加上{}符号,比如${10};
    • 函数返回值需要在调用该函数后通过$?获得。

    11、文件包含
    有的时候某个功能可能被多个脚本使用,这时就需要在将这个功能放到一个公共的文件中,需要这个功能的脚本直接包含这个公共的文件即可,这就是文件的包含,同样的Shell也是支持文件包含的。

    使用.或source加上文件名来包含文件

    先建一个文件test_one.sh:

    #test_one.sh
    var1=1
    

    再建一个文件test_two.sh:

    #test_two.sh
    var2=2
    

    再建一个文件,包含test_one.sh和test_two.sh这两个文件:

    source ./test_one.sh
    source ./test_two.sh
    
    echo "file one var1=${var1}"
    echo "file two var2=${var2}"
    

    相关文章

      网友评论

          本文标题:Shell 编程基础

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