BASH LEARN NOTE

BASH LEARN NOTE

basic

reference-basic

echo

  1. w/o quote

    echo hello world
    result:	hello world
    
  2. w/ single quote

    单引号中变量不能被求值

    name=lina
    echo 'hello $name'
    result:	hello $name
    
  3. w/ double quote

    双引号中变量可以求职

    name=lina
    echo "hello $name"
    result:	hello lina
    

echo -n/e

  1. echo -n

    取消末尾回车符(取消自动换行功能)

  2. echo -e

    转义字符生效

    echo "hello	lina"
    result:	hello	lina
    
    echo -e "hello	lina"
    result:	hello	lina
    

SLMC(single line multi command)

mkdir folder; cd folder; touch note;

SCML(single command multi line)

mkdir	
math	
science	
art		

命令组合符

  1. &&

    command1 && command2

    command1执行成功后执行command2

  2. ||

    command1 || command2

    command1执行失败后执行command2

*type

  判断command为内建命令还是外部程序

hotkey

  Ctrl + l : clear screen

  Ctrl + u : 清除光标至行首

  Ctrl + k : 清除光标至行尾

  Ctrl + a : 光标移至行首

  Ctrl + e : 光标移至行尾

  [Hotkey github](https://gist.github.com/zhulianhua/befb8f61db8c72b4763d)

expansion

  [reference-expansion](https://wangdoc.com/bash/expansion.html)

  [reference-quation](https://wangdoc.com/bash/quotation.html)

  [reference-variable](https://wangdoc.com/bash/variable.html)
  1. ~字符扩展

    • 扩展为home path(最常用)
    • ~user扩展为用户user的home path
    • ~+扩展为当前目录(等同于pwd)[使用频率较低]
  2. ?字符扩展

    • 匹配除空字符外的单个字符
  3. *字符扩展

    • 匹配任意字符
  4. []扩展

    • []匹配方括号中的任意一字符
    • [^]或[!]不匹配方括号中的任意一字符
    • 匹配字符包含[ or ],可以放在任意位置
    • 匹配字符包含连字符-,只能放在开头或结尾
  5. [start-end]扩展

    • [a-z]匹配26个字母
    • [0-9]匹配10个数字
    • [!0-2]不匹配0 1 2(方括号内是感叹号)
  6. {}扩展

    • 扩展成大括号里的所有值,用逗号隔开
    • 字符和逗号间不能有间隔
    echo a{e,f,g}b
    result: aeb afb agb
    
    $ cp a.log{,.bak}
    # 等同于
    # cp a.log a.log.bak
    
    $ echo /bin/{cat,b*}
    /bin/cat /bin/b2sum /bin/base32 /bin/base64 ... ...
    # 基本等同于
    $ echo /bin/cat;echo /bin/b*
    
  7. {start..end}扩展

    • 连续扩展
    $ echo {a..c}
    a b c
    
    $ echo d{a..d}g
    dag dbg dcg ddg
    
    $ echo {1..4}
    1 2 3 4
    
    $ echo Number_{1..5}
    Number_1 Number_2 Number_3 Number_4 Number_5
    
    $ echo {c..a}
    c b a
    
    $ echo {5..1}
    5 4 3 2 1
    
    $ mkdir {2007..2009}-{01..12}
    
    for i in {1..4}
    do
      echo $i
    done
    
    $ echo {01..5}
    01 02 03 04 05
    
    $ echo {001..5}
    001 002 003 004 005
    
    • 连续扩展带步长
    $ echo {0..8..2}
    0 2 4 6 8
    
  8. 变量扩展

    美元符号开头的词组被当作变量

    $ echo $SHELL
    /bin/bash
    
    $ echo ${SHELL}
    /bin/bash
    
    区分变量和其他字符串
    

    ${!string*}${!string@}返回所有匹配给定字符串string的变量名

    $ echo ${!S*}
    SECONDS SHELL SHELLOPTS SHLVL SSH_AGENT_PID SSH_AUTH_SOCK
    
  9. 子命令扩展

    非常有用,定义当前path是就会用到

    • $(command)
    • command
    $ echo $(date)
    Tue Jan 28 00:01:13 CST 2020
    
    $ echo `date`
    Tue Jan 28 00:01:13 CST 2020
    
    CURRENT_PATH=`pwd` or CURRENT_PATH=$(pwd)
    
  10. 算数扩展

    • num=$((a + b))
    • let num=$a+$b [没有空格]
    • let "num = 2 + 3" [有空格需要用双引号]
  11. 字符类

  12. THINK AGAIN

    • []匹配的是有的字符
    • {}是创建包含字符的字符串
    • [start-end]用连字符
    • {start..end}用..
  13. 量词扩展

    • ?(pattern-list):匹配零个或一个模式。
    • *(pattern-list):匹配零个或多个模式。
    • +(pattern-list):匹配一个或多个模式。
    • @(pattern-list):只匹配一个模式。
    • !(pattern-list):匹配零个或一个以上的模式,但不匹配单独一个的模式。
  14. here文档*

    >> Here
    
    content
    
    Here
    

String OP

reference-string

  1. 字符串长度

    ${#varname} {}是必需的

    str="dear lina"
    echo ${#str}
    
  2. 子字符串

    ${varname:offset:length} length可缺省

    $ count=frogfootman
    $ echo ${count:4:4}
    foot
    
  3. 字符串头部模式匹配

    删除匹配的部分返回其余的部分

    ${variable#pattern} 非贪心匹配

    ${variable##pattern} 贪心匹配

    # 如果 pattern 匹配变量 variable 的开头,
    # 删除最短匹配(非贪婪匹配)的部分,返回剩余部分
    ${variable#pattern}
    
    # 如果 pattern 匹配变量 variable 的开头,
    # 删除最长匹配(贪婪匹配)的部分,返回剩余部分
    ${variable##pattern}
    
    $ myPath=/home/cam/book/long.file.name
    
    $ echo ${myPath#/*/}
    cam/book/long.file.name
    
    $ echo ${myPath##/*/}
    long.file.name
    
  4. 字符串头部模式匹配并替换

    ${variable/#pattern/string}

    # 模式必须出现在字符串的开头
    ${variable/#pattern/string}
    
    # 示例
    $ foo=JPG.JPG
    $ echo ${foo/#JPG/jpg}
    jpg.JPG
    
  5. 字符串尾部模式匹配

    ${varname%pattern} 非贪心匹配

    ${varname%%pattern} 贪心匹配

    ${varname/%pattern/string} 匹配并替换

  6. 任意位置匹配

    ${varname/pattern/string} 非贪心匹配

    ${varname//pattern/string} 贪心匹配

  7. 大小写转换

    # 转为大写
    ${varname^^}
    
    # 转为小写
    ${varname,,}
    
原文地址:https://www.cnblogs.com/movit/p/14193052.html