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

  1. 默认情况下,IFS为空格、制表符和换行符三者之一。使用printf "$IFS" | od -b,或echo -n "$IFS" | od -b可以将IFS中的字符对应的二进制打印出来。
  2. 注意,如果不给$IFS加双引号,那么,就会按照IFS本来的意思截断,输入一个空串(如果用不加-n参数的echo则会多输出一个换行符)。BTW. echo虽然好用,但其实printf的扩展性和功能都更强大。
  3. 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

posted @ 2022-09-11 17:26  joel-q  阅读(14)  评论(0编辑  收藏  举报