shell - 琐碎
标准输入stdin与参数args的区别
- rm命令仅支持参数,而不支持标准输入方式。
- cat命令既支持参数(被当作一个文件路径名,e.g.
cat $fileName
),也支持标准输入(比如,用将一个文件重定向为标准输入,e.g.cat < $fileName
)。
$()
、$(())
与${}
三种表达式|变量扩展
- 取运算结果:
$()
的优势在于更容易阅读,`
则为更多的shell编译器所支持。 - 取整数运算结果:
$(())
则可以做整数运算,包括进制的转换、关系运算 等。 - 变量替换
${}
的那些奇技淫巧- 拿掉:
# $ %
在键盘上相邻。#
表示拿掉左边的部分,#
越多,拿掉的越多。%
表示左边保留的部分,%
越多,保留的越少。 - substring:
${var:0:5}
- 子串替换:
/
只替换一个,从左往右,//
全部替换。它可以用来实现字符串分割:${string//,/ }
,将逗号替换为空格。
- 拿掉:
- 注:双引号中,如上三种扩展被实施,但是,通配符
*
在双引号中仅被当作普通的字符,所以,在使用通配符指向的路径时不要用双引号。
here document|string
<< EOF
表示EOF以后的多行直到下一个以EOF打头的多行被定向作为标准输入。- 变体1是分隔符用双引号引的
<< "EOF"
(定界终止读入的分隔符仍然是不加引号的EOF)表示不扩展,而正常情况是变量${}
、运行结果$()
和算数运算结果$(())
都会被扩展。 - 变体2是作为输入定向符号的加短线的
<<- EOF
表示后续多行以Tab开头的字符串(行)行首的Tab将被忽略。
[]
与[[]]
2种条件判断
[]
为所有POSIX标准的shell解释器所支持:支持文件系统路径-e、普通文件-f、字符串判空-z和判不空-n等。[[]]
具有更好的扩展功能:就像MySQL支持简单通配符与正则那样,它既支持简单通配符,e.g.[[ $str == *"$subStr"* ]]
,也支持正则匹配(用=~
表示匹配),并且,子匹配结果,就像Python中的正则匹配结果提供的group
接口一样,shell正则拥有一个${BASH_REMATCH[i]}
数组来存放。
sed正则替换
-r: 扩展的正则表达式,可以用\i(i是自然数)表示捕获到的子串
-i: in place
替换中的/s
表示替换,/g
表示全部替换,并且可以指定分割被替换与替换为的部分所用的分隔符。比如,如下命令用$rule1
匹配,并将匹配到的字符串(行)中的$rule2
所表示的子串替换为$str
;且$str
中可以用\1
表示第1个子匹配字符串,且,分隔符@
也可以用其他字符替换。
sed -i -r "/s$rule1/@$rule2@$str@" $fileName
IFS分隔符 与 I/O
- 默认情况下,IFS为空格、制表符和换行符三者之一。使用
printf "$IFS" | od -b
,或echo -n "$IFS" | od -b
可以将IFS中的字符对应的二进制打印出来。 - 注意,如果不给
$IFS
加双引号,那么,就会按照IFS本来的意思截断,输入一个空串(如果用不加-n参数的echo则会多输出一个换行符)。BTW. echo虽然好用,但其实printf的扩展性和功能都更强大。 IFS=':' read -r -a arrayName
将标准输入按照IFS指定的分隔符分割输入到一个数组中。
ref
https://blog.csdn.net/SeaSky_Steven/article/details/103281133
https://labuladong.gitee.io/algo/5/37/
http://blog.itpub.net/29827284/viewspace-2149116/
https://blog.csdn.net/zwlove5280/article/details/108796326
https://blog.csdn.net/Chaolei3/article/details/124897091
https://copyfuture.com/blogs-details/20211201234322173l