美文网首页
15分钟shell

15分钟shell

作者: 小学2年级 | 来源:发表于2018-08-15 23:10 被阅读0次
    #!/bin/bash
    echo "Hello World !"
    

    要点:

    • '#!' 是约定标记写法, 告诉系统用什么shell来运行
    • 如果是用解释器启动,那么‘#!’无效

    变量

    # 定义变量, 指向jdk8
    JAVA_HOME=/usr/local/jdk8
    
    # 引用变量要加$
    echo $JAVA_HOME
    
    # 同上,但是花括号起到识别边界的作用
    echo ${JAVA_HOME}
    echo $JAVA_HOMEMM   # 为空,JAVA_HOMEMM不存在
    
    # 再次赋值变量前面不要加$
    JAVA_HOME=/usr/local/jdk7
    
    # *变量设置为只读*
    readonly JAVA_HOME
    JAVA_HOME=/usr/local/jdk8 # 报错, read-only variable
    
    # *删除变量,跟变量名, 不需要加$*
    unset JAVA_HOME #  '_' ! 报错,  read-only variable  
    test=123
    unset test
    
    
    

    要点:

    • 命名规范,和其他编程语言类似,也要避免关键字
    • “=”两边不能有空格
    • 再次赋值变量前面不要加$
    • 引用变量要加$

    字符串

    单引号

    # 1. 单引号,纯字符串
    str='this is a string'
    echo $str
    #this is a string
    
    # 2. 单引号必须结对出现,多对表示字符串连接
    str='this is a string'', blala'
    echo $str
    #this is a string, blala
    
    # 3. 强调:变量无效, 因为是纯字符串
    str='java home is $JAVA_HOME'
    echo $str
    #java home is $JAVA_HOME
    
    

    双引号

    
    # 1. 双引号里可以用变量
    str="java home is $JAVA_HOME"
    echo $str
    # -> java home is /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home
    
    # 2. 可以用转义的双引号
    str="java home is \"$JAVA_HOME\""
    echo $str
    # -> java home is "/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home"
    

    拼接

    # Forget JAVA_HOME, So boring!
    theGirl="Monica"
    
    # 1. 双引号对  变量  双引号对
    str="I like "$theGirl"^_^"
    echo $str
    # -> I like Monica^_^
    
    # 2. 双引号对包好变量
    str="I like ${theGirl}."
    echo $str
    # -> I like Monica.
    
    # 3. 单引号对  变量  单引号对
    str='I like '${theGirl}'.'
    echo $str
    # -> I like Monica.
    

    截取

    str=${str%'Script'}
    str="I know javaScript"
    
    # 1. 从右边往左边截取 
    str=${str%'Script'}
    echo $str
    # -> I know java
    
    # 2. SubString
    echo ${str:0:11}
    # -> I know java
    
    

    数组

    # 1. 定义数组, 空格隔开
    #     等同:arr=('a' 'b 'c' 'd')
    arr=(a b c d)  
    
    # 2. 获取元素, 从1开始的
    echo ${arr[1]}
    
    # 3. 获取数组长度
    #     或者 echo ${#arr[*]}
    echo ${#arr[@]}  
    
    

    传参

    定义脚本

    #!/bin/bash
    # author: 小学2年级
    
    echo "参数传递"
    
    # 1. 具体参数是从1开始, 依次类推, 其中0是当前脚本名称
    echo "param 0: $0"
    echo "param 1: $1"
    echo "param 2: $2"
    

    运行脚本

    sh test.sh a1 bc
    

    输出

    参数传递
    param 0: ./test.sh
    param 1: 1
    param 2: 2
    

    运算符

    算术运算符

    mac 中没有expr, 取而代之的是 $(())

    
    # 栗子, 其他算术运算符类似 + - * / %  == !=
    a=3
    b=4
    echo $(($a*$b))
    # -> 12
    

    反引号语法

    内的表达式执行结果,作为一个命令执行

    # 报错, 运算出12并echo,然后把12当成一个命令执行
     `echo $(($a*$b))`
    
    # 正确用法, 拼接字符串并echo,结果为命令,执行cat
    `echo cat 'test.sh'`
    
    

    关系运算符

    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。

    逻辑运算

    运算符 说明 举例
    ! 非运算,表达式为 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。

    流程控制

    if else

    #!/bin/bash
    # author: 小学2年级
    
    a=10
    b=20
    
    # if [] 内部空格开头,空格结尾!
    if [ $a -lt $b ]
    then
        echo "$a is less than $b"
    else
        echo "$a is not less than $b"
    fi
    

    for循环

    #!/bin/bash
    # author: 小学2年级
    
    for loop in a b c d e f g
    do
        echo "the value is : $loop"
    done
    

    while

    #!/bin/bash
    # author: 小学2年级
    
    mutex=5
    #while(($mutex>=0))
    while [ $mutex -ge 0 ]
    do
        echo "current mutex is $mutex "
        #let "mutex--"
        mutex=$(($mutex-1))
    done
    

    do until

    和while类似,不举例子了,语法如下

    until condition
    do
        command
    done
    

    case

    语法

    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    

    栗子

    这是一个启动脚本的雏形

    #!/bin/bash
    # author: 小学2年级
    
    echo '输入start|stop|restart|status '
    echo '你输入指令为:'
    read aNum
    
    # 1. case一个变量, 注意每种情况的语法,以;;结尾
    case $aNum in
        start)
            echo 'starting server.....'
            sleep 1
            echo 'server started.'
        ;;
        stop)
            echo 'stoping server.....'
            sleep 1
            echo 'server stoped.'
        ;;
        restart)
            echo 'restarting server.....'
            sleep 1
            echo 'server stoped.'
            sleep 1
            echo 'server started.'
        ;;
        status)
            echo 'server is running, PID is 1234567'
        ;;
    # 2. 不存在的情况,类似其他语言中的default
        *)
            echo 'useage: xxx.sh start|stop|restart|status'
        ;;
    
    # 3. 结束符号
    esac
    

    函数使用

    #!/bin/bash
    # author: 小学2年级
    
    # 1. 无返回值
    function sayHello(){
        echo "hello lady."
    }
    
    #   1.1 invoke sayHello
    sayHello
    
    
    # 2. 有返回值
    function getSth(){
        return 12
    }
    
    #   2.1 invoke getSth
    getSth
    echo "getSth is $?"
    
    
    # 3. 需要传入参数
    function add(){
        return $(($1 + $2))
    }
    
    #   3.1
    add 1 2
    echo "add 1 2 is $?"
    
    

    输出结果

    hello lady.
    getSth is 12
    add 1 2 is 3
    

    后记

    主要是为了能够快速想起来语法。具体还有很多看上去很奇怪的语法,用到再查吧。

    TODO

    • 把最近storm的发布topology的例子放上来
    • 字符串常用的操作补充

    连接

    相关文章

      网友评论

          本文标题:15分钟shell

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