shell基本语法

[] [[ ]] -n -z

-n:判断字符串是否非空,为空返回1,为false,非空返回0,为true。
-z:判断字符串是否为空,为空返回0,为true,非空返回1,为false。
[]: 内部变量需要加双引号

1
2
3
4
5
pid="123"
[-z "$pid"]
[5 -lt 3] || [3 -gt 2]
[5 -lt 4] && [3 -gt 4]
[5 -le 5] && [3 -eq 3]

文件测试

1
2
3
4
5
6
7
8
9
-e 文件名|	如果文件存在则为真
-r 文件名| 如果文件存在且可读则为真
-w 文件名| 如果文件存在且可写则为真
-x 文件名| 如果文件存在且可执行则为真
-s 文件名| 如果文件存在且至少有一个字符则为真
-d 文件名| 如果文件存在且为目录则为真
-f 文件名| 如果文件存在且为普通文件则为真
-c 文件名| 如果文件存在且为字符型特殊文件则为真
-b 文件名| 如果文件存在且为块特殊文件则为真
1
2
3
-a  :与
-o :或
! :非

例:

1
2
3
4
5
6
if test -e ./File1 -o -e ./File2
then
echo '至少有一个文件存在'
else
echo '两个文件都不存在'
fi

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum$anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
#函数返回值在调用该函数后通$?获得
echo "输入的两个数字之和为 $? !"

输出:

1
2
3
4
5
6
7
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !

参数

1
2
3
4
5
6
7
$#	传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

sed

最基本语句
增:a和i

1
2
3
sed -e 4a\insert-a-line-after-line-4 distance.file
# -e (execute) 可省略
sed -e 4i\insert-a-line-before-line-4 distance.file

删:d

1
2
3
4
5
6
#删除第二行
sed -e 2d distance.file
cat distance.file | sed '2d'

##删除包含pattern字符串的行
cat distance.file | sed '/pattern/d'

改:c

1
2
sed -e 1,2c\replace-line1-to-line2-with-this-line distance.file
cat distance.file | sed '1,2c No 1-2 line'

正则替换:s

1
2


组合命令:

1
2
3
4
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'   
#搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,bash替换为blueshell,再输出这行:(如果不加-n其他行也会输出)

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/g'

字符串替换:s/ / /g

1
cat distance.file | sed 's/source-string/replace-string/g'

gawk

语法

1
gawk options[可省略] program file

grep

在当前目录递归(r)查找pattern字符串,忽略大小写(i),并输出pattern所在行号(n)

1
grep -irn pattern