BASH LEARN NOTE
basic
echo
-
w/o quote
echo hello world result: hello world
-
w/ single quote
单引号中变量不能被求值
name=lina echo 'hello $name' result: hello $name
-
w/ double quote
双引号中变量可以求职
name=lina echo "hello $name" result: hello lina
echo -n/e
-
echo -n
取消末尾回车符(取消自动换行功能)
-
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
命令组合符
-
&&
command1 && command2
command1执行成功后执行command2
-
||
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)
-
~字符扩展
- 扩展为home path(最常用)
- ~user扩展为用户user的home path
- ~+扩展为当前目录(等同于pwd)[使用频率较低]
-
?字符扩展
- 匹配除空字符外的单个字符
-
*字符扩展
- 匹配任意字符
-
[]扩展
- []匹配方括号中的任意一字符
- [^]或[!]不匹配方括号中的任意一字符
- 匹配字符包含[ or ],可以放在任意位置
- 匹配字符包含连字符-,只能放在开头或结尾
-
[start-end]扩展
- [a-z]匹配26个字母
- [0-9]匹配10个数字
- [!0-2]不匹配0 1 2(方括号内是感叹号)
-
{}扩展
- 扩展成大括号里的所有值,用逗号隔开
- 字符和逗号间不能有间隔
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*
-
{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
-
变量扩展
美元符号开头的词组被当作变量
$ echo $SHELL /bin/bash $ echo ${SHELL} /bin/bash 区分变量和其他字符串
${!string*}
或${!string@}
返回所有匹配给定字符串string
的变量名$ echo ${!S*} SECONDS SHELL SHELLOPTS SHLVL SSH_AGENT_PID SSH_AUTH_SOCK
-
子命令扩展
非常有用,定义当前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)
-
算数扩展
- num=$((a + b))
- let num=$a+$b [没有空格]
- let "num = 2 + 3" [有空格需要用双引号]
-
字符类
-
THINK AGAIN
- []匹配的是有的字符
- {}是创建包含字符的字符串
- [start-end]用连字符
- {start..end}用..
-
量词扩展
- ?(pattern-list):匹配零个或一个模式。
- *(pattern-list):匹配零个或多个模式。
- +(pattern-list):匹配一个或多个模式。
- @(pattern-list):只匹配一个模式。
- !(pattern-list):匹配零个或一个以上的模式,但不匹配单独一个的模式。
-
here文档*
>> Here content Here
String OP
-
字符串长度
${#varname} {}是必需的
str="dear lina" echo ${#str}
-
子字符串
${varname:offset:length} length可缺省
$ count=frogfootman $ echo ${count:4:4} foot
-
字符串头部模式匹配
删除匹配的部分返回其余的部分
${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
-
字符串头部模式匹配并替换
${variable/#pattern/string}
# 模式必须出现在字符串的开头 ${variable/#pattern/string} # 示例 $ foo=JPG.JPG $ echo ${foo/#JPG/jpg} jpg.JPG
-
字符串尾部模式匹配
${varname%pattern} 非贪心匹配
${varname%%pattern} 贪心匹配
${varname/%pattern/string} 匹配并替换
-
任意位置匹配
${varname/pattern/string} 非贪心匹配
${varname//pattern/string} 贪心匹配
-
大小写转换
# 转为大写 ${varname^^} # 转为小写 ${varname,,}