1. CMD 输出打印行数
[root@liqiang.io]# ls | grep android | nl
2. 分割输出,每个一行
[root@liqiang.io]# cat /tmp/test.txt
10.0.57.24:10100
[root@liqiang.io]# cat /tmp/test.txt | tr ":" "\n"
10.0.57.24
10100
3. 正则表达式提取 IP 地址
[root@liqiang.io]# cat /tmp/test.txt
10.0.57.24:10100
[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\}"
10.0.57.24
4. 条件判断
[root@liqiang.io]# cat /tmp/test.sh
if [[ "$leader_host" = "$curr_host" ]]; then
return 0
else
return 1
fi
- Compare a string using sh shell
- What is the difference between double and single square brackets in bash?
- 数值测试
- 字符串测试
- 文件测试
5. 休眠一段时间
[root@liqiang.io]# cat /tmp/test.sh
sleep 5
6. 命令中带特殊符号
用单引号就好了:
[root@liqiang.io]# export TOKEN='#$%^&'
7. 写入文本到文件
[root@liqiang.io]# cat <<EOT >> greetings.txt
line 1
line 2
EOT
10. 字符串数组
[root@liqiang.io]# cat backup.sh
MONGO_COLLECTIONS=("a" "b" "c" "d" "e")
for i in $MONGO_COLLECTIONS
do
mongoimport --db databases --collection $i /tmp/databases/$i.json
done
11. 无限循环
[root@liqiang.io]# cat /tmp/run.sh
while :
do
sleep 1
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. 数字系列数组
[root@liqiang.io]# for i in {1..7}
do
echo $i
done
文件和目录操作
一次创建系列目录
[root@liqiang.io]# mkdir dir_{0..9}
安全得创建目录
[root@liqiang.io]# mkdir -p mydir
这样创建即使子目录不存在也不会出错
安全得创建链接
[root@liqiang.io]# ln -sfn source target
-f
:如果链接已经存在了,会先 unlink 后再创建-n
:如果不指定并且是目录链接,则会链接在目录内,加上参数之后效果同-n
cp 命令保持源文件的元属性
[root@liqiang.io]# cp -p a.txt /tmp/b.txt
-p
: 保留指定的属性(默认: mode,ownership,timestamps[modification time, access time]),如果可能的话,附加属性:context, links, xattr, all
回到上次的目录
[root@liqiang.io]# cd -
当前目录的真实目录
当当前目录是软链接时,pwd 只是返回当前的目录,如果需要返回的是真实的目录,需要加上 -P
参数:
[root@liqiang.io]# pwd -P
17. 以一个用户运行命令
[root@liqiang.io]# sudo su -l www-data -s /bin/bash
19. 查看 24 小时之前修改的文件
[root@liqiang.io]# find -mtime 1
-mtime
: 文件最后一次被修改是在n*24小时之前。 当find计算出文件最后一次被访问是在多少个24小时之前时,任何小数部分都会被忽略,所以要匹配-mtime +1,文件必须是在两天前被修改。
22. 查看当前shell
[root@liqiang.io]# echo $SHELL
23. 部分清除历史
通过 history -c
可以清除 shell 的所有历史
部分清除历史命令的操作步骤:
vim ~/.bash_history
- 该文件即为历史记录存储文件,我们随意修改
- 修改后再次 history 查看,发现并没有变化。原因:缓存
- 执行:
history -r
读取历史文件并将其内容添加到历史记录中,即重置文件里的内容到内存中,完成修改!
- 执行:
Sed
替换文件中的关键字
[root@liqiang.io]# sed -i 's/old-text/new-text/g' file_name
引用变量的值来替换
- 关键点:
- 要用双引号
- 变量不用加
{}
[root@liqiang.io]# sed -i "s/old-text/$var_name/g" file_name