IT系统集成商

系统集成 | 虚拟化应用 | 群晖网络存储 | 视频会议 | 数据防泄密 | 技术运维

手机: 130-1534-6247   电话: 0351-2396570

bash、shell、正则表达式

为什么要将Bash、shell、正则表达式三个部分的内容放在一起?在学习中体会到上述三部分的部分语法(表达式)特别容易混淆,所以放在一起作个总结。

1. 变量赋值

    格式:变量名=变量值
    等号两边不能有空格符
  1. 变量值中有空格可以使用双引号“”或者单引号‘’括起来,双引号内的$保留原有特性(双如var="lang is $LANG" ,将在取得$LANG的内容后赋予变量var);单引号内的内容视为一般字符。
  2. 需要通过命令提供信息的,可以使用$(命令)或者`命令`的方式,比如var=$(uname -r)
  3. 两个字符串可以直接连接,比如:name="Welcome to " ;name="$name"linux;结果namer的值为“Welcome to linux”
  4. 变量类型默认为字符串,所以sum=100+30 ;sum的值是字符串"100=30"  ;而不是数字130 ;
  5. 推荐使用 declare  [-air]  变量名  的方式明确声明变量。

​​​​2. 变量取值

  1. 两种方式:$变量名   或者    ${变量名}
  2. 数组元素取值  ${数组元素名}

3. 变量内容删除、替换

  1. 设变量:var=http://www.aaa.com/123.htm
  2. #从左边开始删除,第一次遇到(符合条件最短的)
    • echo ${var#*//}
    • 即删除http://
  3. ​##从左边删除,最后遇到的(符合条件最长的)
    • echo ${var##*/}
    • 即删除http://www.aaa.com/
  4. %从右边删除,第一次遇到的
    • echo ${var%/*}
    • 即删除/123.htm
  5. %%从右边删除,最后一次遇到的
    • echo ${var%%/*}
    • 即删除//www.aaa.com/123.htm ;结果为:"http:"
  6. ${变量名/旧字符串/新字符串} 第一个“旧字符串”会被替换为“新字符串”
  7. ${变量名//旧字符串/新字符串} 全部“旧字符串”会被替换为“新字符串”

4. 变量内容的测试与替换

  1. 类似于 var=${str-expr} ;var=${str:-expr}等等。“Oh,My god!” ,“记不住”,所以还是用后面的[条件]与if语名吧。

5. login shell 读取流程

  1. login shell读取流程

6. 使用source或者小数点 . 都可以将配置文件的内容读进当前的shell环境,而不需要注销。

7. bash中的通配符

  1. 通配符

8. 数据重定向

  1. 标准输入(stdin):代码为0,使用<或者<<
  2. 标准输出(stdout):代码为1,使用>或者>>
  3. 标准错误输出(stderr):代码为2,使用2>或者2>>(注意,明确写出数字2)
  4. /dev/null设备,输出到此设备,所有的信息都被丢弃了。
  5. 将标准输出、错误输出写入同一个文件:
    • find / -name .bashrc >list 2>&1   或者(此处的&1可以理解为对标准输出的引用)
    • find / -name .bashrc &>list
  6. 经常会用前一个命令的stdout作为这次的stdin,某些命令要用文件名,该stdin与stdout可以利用减号-替代:
    • tar -cvf - /home | tar -xvf -
  7. 如果某命令如cat没有文件名参数,或者当参数是-时,则从stdin读取。
    • cat >catfile <~/.bashrc
    • cat >catfile <<"eof"

9. 管道

  1. 管道仅能处理前一个命令的stdout,对stderr没有处理能力。
  2. 每个管理后面的第一个数据必定是“命令”
  3. 双向重定向tee(同时输出自文件与屏幕):cat ~/.bashrc | tee catfile | more 

10. 选取命令cut 

  1. 以行为单位,进行数据提取
  2. cut  -d  '分隔字符'  -f 字段列表,如 echo $PATH | cut -d ":" -f 3,5  (以:为分隔符进行字段划分,取出第3、第5个字段)
  3. cut -c 字符起始范围,如 export | cut -c 12-       或者   12-20

11. 排序命令sort、uniq

  1. sort [-rntk] [file or stdin]
    • -n 使用数字进行排序
    • -r 反向排序
    • -t 指定分隔符,
    • -k 行被分隔符分成若干个字段后,用哪个字段进行排序
    • cat /etc/passwd | sort -t ‘:’ -k 3
  2. uniq重复行仅列出一个,如last | cut -d "  " | sort | uniq 

12. 删除与替换命令tr(不改变文件本身内容)

  1. 将输出的信息中的小写字母变成大写字母:last | tr '[a-z]'  '[A-Z]'

13. xargs命令

  1. 由于很多命令不支持管道来传递参数,所以xargs命令就派上了用场。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。如:将/etc/passwd内的第一列取出,仅取三行,并用finger将每个帐号的信息显示出来
  2. cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs finger
  3. find /sbin -perm +7000 | xargs ls-l (ls不支持管道)