1. CMD 输出打印行数

  1. [root@liqiang.io]# ls | grep android | nl

2. 分割输出,每个一行

  1. [root@liqiang.io]# cat /tmp/test.txt
  2. 10.0.57.24:10100
  3. [root@liqiang.io]# cat /tmp/test.txt | tr ":" "\n"
  4. 10.0.57.24
  5. 10100

3. 正则表达式提取 IP 地址

  1. [root@liqiang.io]# cat /tmp/test.txt
  2. 10.0.57.24:10100
  3. [root@liqiang.io]# cat /tmp/test.txt | grep -o "[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}"
  4. 10.0.57.24

4. 条件判断

  1. [root@liqiang.io]# cat /tmp/test.sh
  2. if [[ "$leader_host" = "$curr_host" ]]; then
  3. return 0
  4. else
  5. return 1
  6. fi

5. 休眠一段时间

  1. [root@liqiang.io]# cat /tmp/test.sh
  2. sleep 5

6. 命令中带特殊符号

用单引号就好了:

  1. [root@liqiang.io]# export TOKEN='#$%^&'

7. 写入文本到文件

  1. [root@liqiang.io]# cat <<EOT >> greetings.txt
  2. line 1
  3. line 2
  4. EOT

10. 字符串数组

  1. [root@liqiang.io]# cat backup.sh
  2. MONGO_COLLECTIONS=("a" "b" "c" "d" "e")
  3. for i in $MONGO_COLLECTIONS
  4. do
  5. mongoimport --db databases --collection $i /tmp/databases/$i.json
  6. done

11. 无限循环

  1. [root@liqiang.io]# cat /tmp/run.sh
  2. while :
  3. do
  4. sleep 1
  5. done

这里用 while : 表示无限循环,其中 : 是 shell 内置命令,永远返回 true;当然可以用 while true,但是其实 true 是一个系统命令 /bin/true,所以每次循环都会开进程调用一次,造成性能损耗,所以推荐使用 while :

test 命令

test 数值测试

test 命令用于检查某个条件是否成立,可以进行数值、字符和文件的测试,可选项为:

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

test 字符串测试

参数 说明
= 相等
!= 不相等
-z 字符串 字符串长度 == 0
-n 字符串 字符串的长度 != 0

test 文件测试

参数 说明
-e 文件名 文件 == 存在
-r 文件名 文件 == 存在 && 可读
-w 文件名 文件 == 存在 && 可写
-x 文件名 文件 == 存在 && 可执行
-s 文件名 文件 == 存在 && 至少有一个字符
-d 文件名 文件 == 存在 && == 目录
-f 文件名 文件 == 存在 && == 普通文件
-c 文件名 文件 == 存在 && == 字符型特殊文件
-b 文件名 文件 == 存在 && == 块特殊文件

15. 数字系列数组

  1. [root@liqiang.io]# for i in {1..7}
  2. do
  3. echo $i
  4. done

文件和目录操作

一次创建系列目录

  1. [root@liqiang.io]# mkdir dir_{0..9}

安全得创建目录

  1. [root@liqiang.io]# mkdir -p mydir

这样创建即使子目录不存在也不会出错

安全得创建链接

  1. [root@liqiang.io]# ln -sfn source target

cp 命令保持源文件的元属性

  1. [root@liqiang.io]# cp -p a.txt /tmp/b.txt

-p: 保留指定的属性(默认: mode,ownership,timestamps[modification time, access time]),如果可能的话,附加属性:context, links, xattr, all

回到上次的目录

  1. [root@liqiang.io]# cd -

当前目录的真实目录

当当前目录是软链接时,pwd 只是返回当前的目录,如果需要返回的是真实的目录,需要加上 -P 参数:

  1. [root@liqiang.io]# pwd -P

17. 以一个用户运行命令

  1. [root@liqiang.io]# sudo su -l www-data -s /bin/bash

19. 查看 24 小时之前修改的文件

  1. [root@liqiang.io]# find -mtime 1

22. 查看当前shell

  1. [root@liqiang.io]# echo $SHELL

23. 部分清除历史

通过 history -c 可以清除 shell 的所有历史

部分清除历史命令的操作步骤:

  1. vim ~/.bash_history
    • 该文件即为历史记录存储文件,我们随意修改
  2. 修改后再次 history 查看,发现并没有变化。原因:缓存
    • 执行:history -r
      读取历史文件并将其内容添加到历史记录中,即重置文件里的内容到内存中,完成修改!

Sed

替换文件中的关键字

  1. [root@liqiang.io]# sed -i 's/old-text/new-text/g' file_name

引用变量的值来替换

  1. [root@liqiang.io]# sed -i "s/old-text/$var_name/g" file_name

一些异常处理

command not found: shopt