变量输出
echo "This is a ${variable}"
命令替换
- 反引号字符 (`)
- $() 格式
testing=`date` 或 testing=$(date)
数学替换
- expr命令执行数学操作
# 命令行操作
expr 1+5
# shell 操作
a=10
b=20
c=$(expr $a * $b)
- 使用方括号
上面的写法过于繁琐,所以有了 $[ operation ] 这种写法。而且,无需担心 shell 会误解乘号或其他符号,也就不会把运算符号理解成通配符,因为它在方括号里。
a=10
b=20
c=$[$b / $a]
注:bash shell 只支持整数运算,需要浮点运算等复杂操作运算可以使用 z shell 或使用内建的bash计算器(又称作bc)
var1=$(echo "scale=4; 3.44 / 5" | bc)
或
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
退出状态码
- 查看退出状态码
date
echo $?
- exit 命令
默认shell脚本会以脚本中的最后一个命令的退出状态码退出。且退出状态码被缩减到了0~255的区间。
结构化命令
- if-then 语句
if command
then
commands
fi
或者
if command; then
commands
fi
- if-then-else 语句
if command
then
commands
else
commands
fi
- if-then-elif-then 语句
if command1
then
commands
elif command2
then
more commands
fi
- test 命令
用于测试命令退出状态码之外的条件。如果 test 命令中列出的条件成立,test 命令就会退出并返回退出状态码0;如果条件不成立,test命令就会退出并返回非零的退出状态码。
- 使用方括号[]替代test命令
注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错
if [ condition ]
then
commands
fi
- if-then 高级特性
bash shell提供了两项可在if-then语句中使用的高级特性:
- 用于数学表达式的双括号
- 用于高级字符串处理功能的双方括号(支持模式匹配,如正则等)
- case 语句
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
sed 用法
# 使用s模式,用 big test 替换 test
echo "This is a test" | sed 's/test/big test/'
# 将 cat 替换为 dog;
# sed编辑器并不会修改文本文件的数据。它只会将修改后的数据发送到 STDOUT
sed 's/dog/cat/' data1.txt
# 在sed命令行上执行多个命令时,只要用-e选项
# 两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。
sed -e 's/brown/green/; s/dog/cat/' data1.txt
# 从文件中读取编辑器命令,script1.sed每行一个编辑命令;使用.sed作为后缀提高理解
sed -f script1.sed data1.txt
awk&gawk 用法
gawk程序脚本用一对花括号来定义。你必须将脚本命令放到两个花括号({})中
由于gawk命令行假定脚本是单个文本字符串,你还必须将脚本放到单引号中
正确写法:gawk ‘{print “Hello World!”}’
- 使用数据字段变量
自动给一行中的每个数据元素分配一个变量。在文本行中,每个数据字段都是通过字段分隔符划分的。gawk在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。gawk中默认的字段分隔符是任意的空白字符(例如空格或制表符)
$0代表整个文本行;
$1代表文本行中的第1个数据字段;
$n代表文本行中的第n个数据字段。
# 使用-F设置分隔符
gawk -F:(用:来分割) '{print $1}' /etc/passwd
- 使用多个命令
#在命令行上的程序脚本中使用多条命令,在命令之间放个分号即可
echo "My name is Rich" | gawk '{$4="Christine"; print $0}' # 该程序将字段变量$4赋值,然后打印整条语句
- 从文件中读取程序
跟sed编辑器一样,gawk编辑器允许将程序存储到文件中,然后再在命令行中引用。
# script2.gawk 的内容
{
text = "' 's home directory is "
print $1 text $6 # 引用变量时不需要加$符号
}
gawk -F: -f script2.gawk /etc/passwd
- 前置&后置操作
gawk 'BEGIN {print "Hello World!"}'
gawk 'END {print "This is an ending!"}'
- 使用脚本
grep
grep -v “grep” takes input line by line, and outputs only the lines in which grep does not appear. Without -v, it would output only the lines in which grep does appear.
e.g.ps -ef | grep yunmai-cancreate | grep -v grep | awk '{print $2}'