美文网首页
编译原理与语法(四)——shell语法

编译原理与语法(四)——shell语法

作者: 王志强_9380 | 来源:发表于2019-10-10 17:09 被阅读0次

    例子

    使用vim命令创建一个sh文件并编辑

    vim demo.sh
    

    在输入框中输入测试代码

    #!/bin/bash
    # shell测试
    echo "hello world"
    

    可以看到,第一个#表示引入bin/bash,后面的#表示注释
    按ESC后,输入:wq,退出并保存文件
    执行文件:./demo.sh

    -bash: ./demo.sh: 权限不够

    修改权限:chmod 777 demo.sh
    再次执行文件:./demo.sh

    hello world

    也可以通过这个执行sh文件:/bin/bash demo.sh
    这种执行方式不需要权限

    变量

    形式 说明
    $0 当前程序名称
    $n 程序输入参数,1第一个参数2第二个参数
    $* 所有的输入参数
    $# 输入参数的个数
    $? 命令执行的状态。0表示成功
    #!/bin/bash
    # shell测试
    echo "hello world"
    
    A=10
    echo $A
    echo "###############"
    echo $0
    echo $1
    echo $2
    echo $3
    

    执行结果:

    hello world
    10
    ###############
    ./demo.sh


    可以看到使用变量就是$符号加行变量名
    如果执行: ./demo.sh 第一个参数 第二个参数 第三个参数

    hello world
    10
    ###############
    ./demo.sh
    第一个参数
    第二个参数
    第三个参数

    接着测试

    #!/bin/bash
    # shell测试
    echo "hello world"
    
    A=10
    echo $A
    echo "###############"
    echo $0
    echo $1
    echo $2
    echo $3
    echo "变量 \$* 是:$*"
    echo "变量 \$# 是:$#"
    echo "变量 \$? 是:$?"
    

    执行: ./demo.sh 第一个参数 第二个参数

    hello world
    10
    ###############
    ./demo.sh
    第一个参数
    第二个参数

    变量 $* 是:第一个参数 第二个参数
    变量 $# 是:2
    变量 $? 是:0

    注意

    $?表示的是上一次命令是否成功
    定义变量时不能有空格,比如A=10改为A = 10,就是错误的

    形式 说明
    ${var} 变量本来的值
    ${var:-word} 如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。
    ${var:=word} 如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为word。
    ${var:?message} 如果变量var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。若此替换出现在shell脚本中,那脚本将停止运行。
    ${var:+word} 如果变量var被定义,那么返回word,但不改变var的值。

    循环语句for

    #! /bin/bash
    for i in `seq 1 15`
    do
        echo "值是 $i"
    done
    

    上面的语句中:seq 1 15是产生一个1到15的数字集合
    执行结果为

    值是 1
    值是 2
    值是 3
    值是 4
    值是 5
    值是 6
    值是 7

    值是 8
    值是 9
    值是 10
    值是 11
    值是 12
    值是 13
    值是 14
    值是 15

    求和
    #! /bin/bash
    j=0
    for((i=0; i< 15; i++))
    do
            j=`expr $i + $j`
    done
    echo $j
    

    执行结果:105
    注意expr $i + $j,加号之间一定要有空格
    如果 是expr $i+$j,那么执行后的结果:14+13+12+11+10+9+8+7+6+5+4+3+2+1+0+0

    压缩指定文件
    #! /bin/bash
    for i in `find /root -name "*.sh"`
    do
        tar -czf sh.tgz $i
    done
    

    循环语句while

    #! /bin/bash
    i=0
    while((i<10))
    do
            echo $i
            i=`expr $i + 1`
    done
    

    执行结果

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

    shell读文件
    #! /bin/bash
    while read line
    do
        echo $line
    done<./test.txt
    

    if语句

    #! /bin/bash
    num1=100
    num2=200
    if(($num1>$num2));then
            echo "num1>num2"
    else
            echo "num1<num2"
    fi
    

    注意:if语句没有{},只需要分号
    语句一定要有Tab键输入

    逻辑运算符 说明
    -f 判断文件是否存在
    -d 判断目录是否存在
    -eg 等于(整形比较)
    -ne 不等于 !=
    -le 小于 <
    -ge 大于或等于 >=
    -a 双方都成立 &&
    -o 单方成立

    例子

    #! /bin/bash
    TESTDIR=./test
    
    if [ ! -d $TESTDIR ];then
            mkdir -p $TESTDIR
    else
            echo "目录存在"
    fi
    

    如果test不存在,则创建,否则打印目录存在

    注意:
    if和[之间要有空格,否则会报语法错误
    mkdir -p,相当于android中的mkdirs

    算数运算符

    运算符 说明 举例
    + 加法 `expr $a + $b`
    - 减法 `expr $a - $b`
    * 乘法 `expr $a * $b`
    / 除法 `expr $a / $b`
    % 取余 `expr $a % $b`
    = 赋值 a=$b
    == 相等 [ a ==b ]
    != 不相等 [ a !=b ]
    算数运算的方式
    使用 $(( ))
    r=$(( 4 + 5 ))
    
    使用 $[ ]
    r=$[ 4 + 5 ]
    
    使用let命令
    n=10
    let n=n+1
    
    使用 expr 外部程式(推荐)
    r=`expr 4 + 5 `
    

    关系运算符

    运算符 说明 举例
    -eq 相等 [ $a -eq $b ]
    -ne 不相等 [ $a -ne $b ]
    -gt 大于 [ $a -gt $b ]
    -lt 小于 [ $a -lt $b ]
    -ge 大于等于 [ $a -ge $b ]
    -le 小于等于 [ $a -le $b ]

    字符串运算符

    运算符 说明 举例
    = 字符串是否相等 [ $a = $b ]
    != 字符串是否不相等 [ $a != $b ]
    -z 字符串长度是否为0 [ -z $a ]
    -n 字符串长度是否不为0 [ -n "$a"]
    $ 字符串是否为空 [ $a ]

    重定向

    < 输入重定向
    cat 0< test.txt

    注意:< 后面一定要有空格,代表后面是个文件

    > 输出重定向
    echo hello > file
    把hello输出到file文件中

    函数

    #! /bin/bash
    function test(){
        echo "这是一个函数"
        cc="函数里的变量"
        echo $cc
        echo $1
        echo $3
    }
    test 11 33 55
    

    这是一个函数
    函数里的变量
    11
    55

    计算阶乘

    #! /bin/bash
    a=1
    factorial(){
    for((i=1;i<$1;i++))
    do
        a=$[$a * $i]
    done
    echo "$1 的阶乘是 $a "
    }
    factorial $1
    

    输入: ./function.sh 6
    输出:6 的阶乘是 120

    注意:
    factorial $1的这个$1是执行命令时传递进去的,比如上面的./function.sh 6的这个6.
    factorial函数内的$i是传递进函数的参数,是通过函数调用传进去的

    上面的函数也可以这么写

    factorial(){
    for i in `seq $1`
    do
        let a*=$i
    done
    echo "$1 的阶乘是 $a "
    }
    
    函数返回值
    funreturn(){
    read -p "请输入数值" num
    return $[2*num]
    }
    funreturn
    echo "funreturn value: $?"
    

    请输入数值100
    funreturn value: 200
    请输入数值300
    funreturn value: 88

    我们可以看到,第二次输入的数值答案是错的,是因为$?一般用来表示函数的执行状态,并且它的范围0~255,当超过这个数值时,会返回一个错误的值
    return 这个关键字,仅仅是表示把结果保存起来,并不是返回的意思。在return后面继续添加语句,一样会继续执行
    那么如何取得大于255的返回值呢,我们可以使用echo

    funreturn(){
    read -p "请输入数值" num
    return $[2*num]
    echo $[2*$num]
    }
    result=`funreturn`
    echo "funreturn value: $?"
    echo "funreturn value: $result"
    

    请输入数值600
    funreturn value: 0
    funreturn value: 1200

    可以看到,答案是对的,并且 return并没有终止函数

    相关文章

      网友评论

          本文标题:编译原理与语法(四)——shell语法

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