zoukankan      html  css  js  c++  java
  • shell脚本编程

    执行

    #!/bin/bash               #声明使用的解释器
    echo "Hello World !"             #输出语句

     

    chmod +x ./test.sh           #赋予可执行权限

    ./test.sh                        #执行脚本

    bin/sh test.sh            #也可以解释器运行

    shell 变量

    可以用语句赋值 for file in `ls /etc` 或者 for file in $(ls /etc)

    可以将 /etc 下的目录文件名循环出来

     

    name="hello"

    echo $name

    echo ${name}

    只读变量

    myurl="http://baidu.com"

    readonly myurl

    然后不可以再赋值了

     

    删除变量

     unset variable

    变量删除后不能使用

     

    shell 字符串

    字符串可以用单引号,也可以用双引号,也可以不用引号。

    str = 'hello world'   

    #单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

    单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

     

    your_name='qinjx'

    str="Hello, I know you are "$your_name"! "

    双引号里可以有变量,可以出现转义字符

     

    拼接字符串

    your_name="qinjx"

    greeting="hello, "$your_name" !"

    greeting_1="hello, ${your_name} !"

    echo $greeting $greeting_1

     

    获取字符串长度

    string="abcd"

    echo ${#string} #输出 4

     

    提取字符串

    string="runoob is a great site"

    echo ${string:1:4} # 输出 unoo

     

    查找字符串

    string="runoob is a great company"

    echo `expr index "$string" is`  # 输出 8

     

    shell数组

    支持一维数组

    array_name=(value0 value1 value2 value3)

    array_name[0]=value0

    array_name[1]=value1

    array_name[n]=valuen

    可以不使用连续的下标,而且下标的范围没有限制。

    读取数组valuen=${array_name[n]}

     

    使用 @ 符号可以获取数组中的所有元素,例如:

    echo ${array_name[@]}

    echo ${array_name[*]}

     

    获取数组的长度

    获取数组长度的方法与获取字符串长度的方法相同,例如:

     

    # 取得数组元素的个数

    length=${#array_name[@]}

    # 或者

    length=${#array_name[*]}

    # 取得数组单个元素的长度

    lengthn=${#array_name[n]}

     

    shell注释

    #

    或者多行注释  

    :<<EOF

    注释内容。。。

    注释内容。。。

    。。。

    EOF

     

    :<<E'

    注释内容。。。

    注释内容。。。

    。。。

    '

    :<<!

    注释内容。。。

    注释内容。。。

    。。。

     

    传递参数 

    向脚本传递参数

    $0   为文件名  ./test.sh

    $i   为第i个参数

     

    $# 传递到脚本的参数个数

    $* 以一个单字符串显示所有向脚本传递的参数。

    如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

    $$ 脚本运行的当前进程ID号

    $! 后台运行的最后一个进程的ID号

    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。

    如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

    $- 显示Shell使用的当前选项,与set命令功能相同。

    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

     

    if [ -n "$1" ]; then

        echo "包含第一个参数"

    else

        echo "没有包含第一参数"

    fi

    注意:的是中括号 [] 与其中间的代码应该有空格隔开

     

    shell 基本运算符

    bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

    完整的表达式要被 ` ` 包含

    val =`expr 2+2`

     

    运算符   说明     举例

    +  加法  `expr $a + $b` 结果为 30。

    -  减法  `expr $a - $b` 结果为 -10。

    *  乘法  `expr $a * $b` 结果为  200。

    /  除法  `expr $b / $a` 结果为 2。

    %  取余  `expr $b % $a` 结果为 0。

    =  赋值  a=$b 将把变量 b 的值赋给 a。

    == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。

    != 不相等。用于比较两个数字,不相同则返回 true。   [ $a != $b ] 返回 true。

     

    乘号(*)前边必须加反斜杠()才能实现乘法运算;

     

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

     

    运算符   说明                 举例

    -eq   检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。

    -ne   检测两个数是否不相等,不相等返回 true。   [ $a -ne $b ] 返回 true。

    -gt   检测左边的数是否大于右边的,如果是,则返回 true。   [ $a -gt $b ] 返回 false。

    -lt   检测左边的数是否小于右边的,如果是,则返回 true。   [ $a -lt $b ] 返回 true。

    -ge   检测左边的数是否大于等于右边的,如果是,则返回 true。   [ $a -ge $b ] 返回 false。

    -le   检测左边的数是否小于等于右边的,如果是,则返回 true。   [ $a -le $b ] 返回 true。

     

    布尔运算符

    下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

    运算符   说明                 举例

    !  非运算,表达式为 true 则返回 false,否则返回 true。   [ ! false ] 返回 true。

    -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。

    -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

     

     

    逻辑运算符

    以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

     

    运算符   说明           举例

    && 逻辑的 AND  [[ $a -lt 100 && $b -gt 100 ]] 返回 false

    || 逻辑的 OR   [[ $a -lt 100 || $b -gt 100 ]] 返回 true

     

    字符串运算符

    下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

    运算符   说明  举例

    =  检测两个字符串是否相等,相等返回 true。   [ $a = $b ] 返回 false。

    != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。

    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。

    -n 检测字符串长度是否为0,不为0返回 true。 [ -n "$a" ] 返回 true。

    str   检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

     

     

    文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性。

     

    属性检测描述如下:

     

    操作符   说明  举例

    -b file  检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

    -c file  检测文件是否是字符设备文件,如果是,则返回 true。   [ -c $file ] 返回 false。

    -d file  检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。

    -f file  检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。   [ -f $file ] 返回 true。

    -g file  检测文件是否设置了 SGID 位,如果是,则返回 true。   [ -g $file ] 返回 false。

    -k file  检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。   [ -k $file ] 返回 false。

    -p file  检测文件是否是有名管道,如果是,则返回 true。   [ -p $file ] 返回 false。

    -u file  检测文件是否设置了 SUID 位,如果是,则返回 true。   [ -u $file ] 返回 false。

    -r file  检测文件是否可读,如果是,则返回 true。   [ -r $file ] 返回 true。

    -w file  检测文件是否可写,如果是,则返回 true。   [ -w $file ] 返回 true。

    -x file  检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。

    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。   [ -s $file ] 返回 true。

    -e file  检测文件(包括目录)是否存在,如果是,则返回 true。   [ -e $file ] 返回 true。

     

    显示变量

    #!/bin/sh

    read name

    echo "$name It is a test"

     

    echo -e "OK! " # -e 开启转义

    echo "It it a test"

     

    #!/bin/sh

    echo -e "OK! c" # -e 开启转义 c 不换行

    echo "It is a test"

     

    显示结果定向至文件

    echo "It is a test" > myfile

     

    原样输出字符串,不进行转义或取变量(用单引号)

    echo '$name"'

    输出结果:

    $name"

     

    显示命令执行结果

    echo `date`

    注意: 这里使用的是反引号 `, 而不是单引号 '。

     

    结果将显示当前日期

    Thu Jul 24 10:08:46 CST 2014

     

     

     

     

     

     

     

     

    echo输出的字符串总结

     

    ===================================================================

     

                  能否引用变量  |  能否引用转移符  |  能否引用文本格式符(如:换行符、制表符)

     

    单引号  |    否         |   否             |           否

     

    双引号  |    能    |        能             |             能

     

    无引号  |    能   |      能             |             否                         

     

    ===================================================================read -p "请输入一段文字:" -n 6 -t 5 -s password

     

    read -p "请输入一段文字:" -n 6 -t 5 -s password    #变量password放在最后

    echo -e " password is $password"

     

    参数说明:

     -p 输入提示文字

     -n 输入字符长度限制(达到6位,自动结束)

     -t 输入限时

     -s 隐藏输入内容

     

    printf

     

    $ echo "Hello, Shell"

    Hello, Shell

    $ printf "Hello, Shell "

    Hello, Shell

     

    printf "%-10s %-8s %-4s " 姓名 性别 体重kg 

    printf "%-10s %-8s %-4.2f " 郭靖 男 66.1234

    printf "%-10s %-8s %-4.2f " 杨过 男 48.6543

    printf "%-10s %-8s %-4.2f " 郭芙 女 47.9876

    姓名     性别   体重kg

    郭靖     男      66.12

    杨过     男      48.65

    郭芙     女      47.99

    %s %c %d %f都是格式替代符

     

    %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

     

    %-4.2f 指格式化为小数,其中.2指保留2位小数。

     

    printf的转义序列

    序列  说明

    a 警告字符,通常为ASCII的BEL字符

     后退

    c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略

    f 换页(formfeed)

    换行

    回车(Carriage return)

    水平制表符

    v 垂直制表符

    \ 一个字面上的反斜杠字符

    ddd  表示1到3位数八进制值的字符。仅在格式字符串中有效

    ddd 表示1到3位的八进制值字符

     

    %d %s %c %f 格式替代符详解:

     

    d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,否则报错!

     

    s: String 字符串 -- 对应位置参数必须是字符串或者字符型,否则报错!

     

    c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则报错!

     

    f: Float 浮点 -- 对应位置参数必须是数字型,否则报错!

     

    如:其中最后一个参数是 "def",%c 自动截取字符串的第一个字符作为结果输出。

     

    $  printf "%d %s %c " 1 "abc" "def"

    1 abc d

     

    test命令

     

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

     

    num1="ru1noob"

    num2="runoob"

    if test $num1 = $num2

    then

        echo '两个字符串相等!'

    else

        echo '两个字符串不相等!'

    fi

     

    也可以测试文件

     

    流程控制

     

    if 语句语法格式:

     

    if condition

    then

        command1

        command2

        ...

        commandN

    fi

     

    写成一行(适用于终端命令提示符):

     

    if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

     

     

    if else 语法格式:

     

    if condition

    then

        command1

        command2

        ...

        commandN

    else

        command

    fi

     

    if else-if else 语法格式:

     

    if condition1

    then

        command1

    elif condition2

    then

        command2

    else

        commandN

    fi

     

    eg:

    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

    输出结果:

     

    a 小于 b

     

    eg2:

    num1=$[2*3]

    num2=$[1+5]

    if test $[num1] -eq $[num2]

    then

        echo '两个数字相等!'

    else

        echo '两个数字不相等!'

    fi

    输出结果:

     

    两个数字相等!

     

    for循环

    for var in item1 item2 ... itemN

    do

        command1

        command2

        ...

        commandN

    done

    写成一行:

     

    for var in item1 item2 ... itemN; do command1; command2… done;

     

     

    for loop in 1 2 3 4 5

    do

        echo "The value is: $loop"

    done

    输出结果:

     

    The value is: 1

    The value is: 2

    The value is: 3

    The value is: 4

    The value is: 5

    顺序输出字符串中的字符:

     

    for str in 'This is a string'

    do

        echo $str

    done

     

    while循环

    while condition

    do

        command

    done

    以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。

     

    #!/bin/bash

    int=1

    while(( $int<=5 ))

    do

        echo $int

        let "int++"

    done

    运行脚本,输出:

     

    1

    2

    3

    4

    5

     

    无限循环

    无限循环语法格式:

     

    while :

    do

        command

    done

    或者

     

    while true

    do

        command

    done

    或者

     

    for (( ; ; ))

     

    until

     

    until condition

    do

        command

    done

    condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

     

    以下实例我们使用 until 命令来输出 0 ~ 9 的数字:

     

    #!/bin/bash

     

    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

     

    eg:

    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 函数

    shell中函数的定义格式如下:

     

    [ function ] funname [()]

     

    {

     

        action;

     

        [return int;]

     

    }

     

    eg:

    demoFun(){

        echo "这是我的第一个 shell 函数!"

    }

    echo "-----函数开始执行-----"

    demoFun

    echo "-----函数执行完毕-----"

     

    funWithReturn(){

        echo "这个函数会对输入的两个数字进行相加运算..."

        echo "输入第一个数字: "

        read aNum

        echo "输入第二个数字: "

        read anotherNum

        echo "两个数字分别为 $aNum 和 $anotherNum !"

        return $(($aNum+$anotherNum))

    }

    funWithReturn

    echo "输入的两个数字之和为 $? !"

    函数返回值在调用该函数后通过 $? 来获得。

     

    funWithParam(){

        echo "第一个参数为 $1 !"

        echo "第二个参数为 $2 !"

        echo "第十个参数为 $10 !"

        echo "第十个参数为 ${10} !"

        echo "第十一个参数为 ${11} !"

        echo "参数总数有 $# 个!"

        echo "作为一个字符串输出所有参数 $* !"

    }

    funWithParam 1 2 3 4 5 6 7 8 9 34 73

    输出结果:

     

    第一个参数为 1 !

    第二个参数为 2 !

    第十个参数为 10 !

    第十个参数为 34 !

    第十一个参数为 73 !

    参数总数有 11 个!

    作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

    注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/BetterThanEver_Victor/p/9355017.html
Copyright © 2011-2022 走看看