zoukankan      html  css  js  c++  java
  • SHELL脚本的一些特殊用法

    • +=运算符
    数组追加:
    
    $ arr=(1 2 3)
    $ arr+=(4 5)
    
    自然地我们会想到如果一个变量是数字,是否也可以用+=作运算呢?
    
    $ i=1
    $ i+=1
    但是,运行后你会发现i的结果并不为2,而是11,这里bash并不认为i是一个整数,而是作为字符串。
    
    这时可以通过declare声明一个变量为整数,上面的问题就解决了:
    
    $ declare -i int=1
    $ int+=1
    $ echo $int
    2
    • Here document不为人知的用法
    一般的here document的用法是这样的:
    
    $ cat b.sh 
    cat<<EOF
    hello, $USER
    EOF
    $ sh b.sh 
    hello, kodango
    here document中的变量都是会被展开的,那能不能不展开呢?答案是可以的,将EOF用引号括起来就可以:
    
    $ cat b.sh 
    cat<<"EOF"
    hello, $USER
    EOF
    $ sh b.sh 
    hello, $USER
    一般here document用得最多的是在帮助函数(helpusage)函数里面,因为在这里我们要写一大段的脚本用法。
    
    如果你有强迫症(比如我),有时候使用here document的时候会很不爽,因为here document里面每行首部的空格都会被保留,而如果要顶格写,在缩进的地方又会有点打乱结构,例如:
    
    $ cat b.sh
    # part 1
    if :; then
    cat << EOF
    hello, $USER 
    EOF
    fi
    
    # part 2
    if :; then
    if :; then
    cat << EOF
    hello, $USER 
    EOF
    fi
    fi
    上面的脚本执行的结果为:
    
    $ sh b.sh 
    hello, kodango # part 1 result
    hello, kodango # part 2 result
    有没有办法既兼顾到缩进又能不保留行首空格呢?
    
    答案也是肯定的,只不过语法又要稍稍变一下,现在在<<的后面加一个短横,这个用法下,行首的Tab字符都会被忽略:
    
    $ cat b.sh 
    if :; then
    cat <<- EOF
    hello, $USER 
    EOF
    fi
    $ sh b.sh 
    hello, kodango
    fi
    一定要是Tab键哦,空格也是不可以的,在vim里面还要注意如果设置了smarttab选项,行首插入的Tab键会替换成相应个数的空格(这里可以按ctrl+v tab插入实际的空格)。
    
    关于这一节的内容,可以进一步参考Redirection#here_documents [Bash Hackers Wiki]。
    • 善用let或者(())命令做算术运算
    如何对一个数字做++运算,可能你会这样用:
    a=1
    a=`expr a + 1`
    为何不用你熟悉的:
    
    a=1
    let a++
    let a+=2
    • SHELL调试
    1. 通过set -o命令来查看当前 shell 的选项配置。
    2. set -x
    这个可以打开 shell 的调试开关,调试 shell 脚本非常有用.
  • 相关阅读:
    深入Spring Security魔幻山谷-获取认证机制核心原理讲解
    灵魂拷问:你真的理解System.out.println()打印原理吗?
    解决分布式React前端在开发环境的跨域问题
    “我以为”与“实际上”
    前端:如何让background背景图片进行CSS自适应
    VSCode如何设置Vue前端的debug调试
    【JDBC】总结
    【JDBC第9章】Apache-DBUtils实现CRUD操作
    【JDBC第8章】数据库连接池
    【JDBC第7章】DAO及相关实现类
  • 原文地址:https://www.cnblogs.com/eric-geoffrey/p/5012091.html
Copyright © 2011-2022 走看看