Shell编程

作者: 盗梦者_56f2 | 来源:发表于2018-08-25 16:21 被阅读9次

    shell环境

    一般常用的有两种,分别为:/bin/sh 和 /bin/bash
    我们一般会在shell脚本的首行添加:#!/bin/sh 或者 #!/bin/bash
    #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
    运行shell脚本的方式一般有两种:./test.sh (执行命令 chmod +x ./test.sh 使test.sh具有可执行权限) 和 sh test.sh 或者 bash test.sh

    shell变量

    #定义变量
    val="Hello World"
    #使用变量
    echo ${your_name}
    #定义只读变量
    myVar="http://www.google.com"
    readonly myVar
    myVar="Hello world" #会报错,因为该变量是只读的。
    #删除变量
    unset myVar
    #获取字符串长度
    string="abcd"
    echo ${#string} #输出 4
    #截取字符串
    string="runoob is a great site"
    echo ${string:1:4} # 输出 unoo
    echo ${var:7} #从左边第几个字符开始,一直到结束。
    echo ${var:0-7:3} #从右边第几个字符开始,及字符的个数
    echo ${var:0-7} #从右边第几个字符开始,一直到结束。
    echo ${var#*/} #其中 var 是变量名,# 号是运算符,*/表示从左边开始删除第一个 / 号及左边的所有字符
    echo ${var##*/} # ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
    echo ${var%/*} # %/* 表示从右边开始,删除第一个 / 号及右边的字符
    echo ${var%%/*} # %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
    

    shell数组

    #定义数组
    array_name=(value0 value1 value2 value3)
    #读取数组元素
    valuen=${array_name[n]} # n为下标
    #获取数组中的所有元素
    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    

    shell注释

    以"#"开头的行就是注释,会被解释器忽略。
    # 这是一个注释
    #多行注释
    :<<EOF
    注释内容...
    注释内容...
    注释内容...
    EOF
    

    read命令

    read -p "input a val:" a    #获取键盘输入的 a 变量数字 -p 参数由于设置提示信息
    echo $a
    

    expr命令

    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

    expr 1 + 2 #输出3
    expr 5 \* 6      #输出30
    

    shell传递参数

    我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,其中0 为执行的文件名。$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    shell文件包含

    . filename   # 注意点号(.)和文件名中间有一空格
    或
    source filename
    

    test命令

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

    #数值测试
    num1=100
    num2=100
    if test $[num1] -eq $[num2]
    then
        echo '两个数相等!'
    else
        echo '两个数不相等!'
    fi
    #字符串测试
    num1="ru1noob"
    num2="runoob"
    if test $num1 = $num2
    then
        echo '两个字符串相等!'
    else
        echo '两个字符串不相等!'
    fi
    #文件测试
    if test -e ./bash
    then
        echo '文件已存在!'
    else
        echo '文件不存在!'
    fi
    -e 文件名  如果文件存在则为真
    -s 文件名  如果文件存在且至少有一个字符则为真
    -d 文件名  如果文件存在且为目录则为真
    -f 文件名  如果文件存在且为普通文件则为真
    

    echo命令

    echo "It is a test"
    echo "$name It is a test"
    echo -e "OK! \c" # -e 开启转义 \c 不换行
    echo `date`
    

    printf命令

    #默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
    printf "Hello, Shell\n"
    printf "%d %s\n" 1 "abc"
    printf %s abc def #输出abcdef
    

    shell流程控制

    #判断语句
    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    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
    #for循环
    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    for loop in 1 2 3 4 5
    do
        echo "The value is: $loop"
    done
    for((i=1;i<=5;i++));do
        echo "这是第 $i 次调用";
    done;
    #while循环
    while condition
    do
        command
    done
    int=1
    while(( $int<=5 ))
    do
        echo $int
        let "int++"
    done
    while true
    do
        command
    done
    #until循环
    #until 循环执行一系列命令直至条件为 true 时停止。
    #until 循环与 while 循环在处理方式上刚好相反。
    until condition
    do
        command
    done
    a=0
    
    until [ ! $a -lt 10 ]
    do
       echo $a
       a=`expr $a + 1`
    done
    #case语句
    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    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
    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
    

    shell函数

    [ function ] funname [()]
    
    {
    
        action;
    
        [return int;]
    
    }
    demoFun(){
        echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    demoFun
    echo "-----函数执行完毕-----"
    

    shell从定向

    command > file  将输出重定向到 file。
    command < file  将输入重定向到 file。
    command >> file 将输出以追加的方式重定向到 file。
    标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
    command > file 2>&1 #将 stdout 和 stderr 合并后重定向到 file
    command > /dev/null #如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null
    #/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
    command > /dev/null 2>&1 #如果希望屏蔽 stdout 和 stderr
    

    let命令

    let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式

    let a=5+4
    let b=9-3 
    echo $a $b
    

    相关文章

      网友评论

        本文标题:Shell编程

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