1.构建基础脚本
1.1 创建shell脚本
1.1.1 第一行需要指定使用的shell
# 用作注释行.shell并不会处理脚本中的注释行,但是第一行的注释,会告诉shell使用哪个shell来运行脚本.
#!/bin/bash
1.1.2 让shell找到你的脚本
直接运行脚本会提示-bash: a.sh: command not found.因为shell会通过PATH环境变量来查找命令,但是很明显PATH里面不存在我们的脚本路径
要让shell找到a.sh脚本有两种方法
1)将放置shell脚本的目录添加到PATH环境变量中
2)在命令行中间使用绝对或是相对路径来引用shell脚本
1.1.3 给shell脚本赋予执行权限
因为umask的默认值为022,所以创建出来的文件权限是644,文件没有执行权限,所以需要添加执行权限
1.2 echo 显示消息
1) echo + 字符串,就会显示这个字符串,使用单双引号的不同嵌套方式来实现显示字符串里面存在引号
2)echo -n将字符串和命令输出在同一行
1.3 使用变量2==
1.3.1 环境变量
环境变量包括全局环境变量和局部环境变量,全局使用printenv查看,set可以查看所有环境变量.在脚本中间可以在环境变量名前加$来使用他们,但是在shell中间看到$就以为在引用变量,要显示$的话,就需要反斜线来实现转义.
1.3.2 用户自定义变量
自定义变量可以数字字母下划线组成,变量名区分大小写.重要的是变量名=值,三者之间没有空格. 赋值时变量不需要加$,引用时前面需要加$.
1.3.3 命令替换
shell脚本中可以从命令输出中提取信息并将其赋值给变量.将输出赋值给变量之后,就可以在脚本中随意使用了.
有两种方法可以将命令输出给变量:
1) 反引号
2) $()
将/usr/bin文件夹下面的的内容,写入到.log文件中,文件名按照当前日期 来进行命名.
+%y%m%d会将日期显示为两位数字的年月日.
1.4 重定向输入和输出
1.4.1 输出重定向
格式: command > outputfile
会将命令的输出发送至文件里面.重定向运算符会创建新的文件(使用默认的umask设置),如果文件已存在,就会用新数据覆盖已有数据.
格式:command >> outputfile
如果文件已经存在就进行追加而不是覆盖.
1.4.2 输入重定向
格式: command < inputfile
会将文件的内容重定向至命令.
wc命令可以统计数据中的文本,默认输出3个值,文本的行数,文本的单词数,文本的字节数.
输出的内容为55行,82个单词,994个字节
1.4.3 内联输入重定向
格式:command << marker
data
marker
无需使用文件进行重定向,只需要在命令行中间指定用于输入重定向的数据即可.这个marker作为文本的起止符号.
# !/bin/bash
wc << EOF
test string 1
test string 2
test string 3
EOF
1.4.4 输入和输出重定向结合使用
格式: command > outputfile <<marker
data
marker
将执行command的输出放入到重定向的文件里面
# !/bin/bash
cat > $(date +%y%m%d).log << EOF
test string 1
test string 2
test string 3
EOF
1.5 管道
格式: command1 | command2
将第一个命令产生的输出传给第二个命令
1.6 执行数学运算
在bash中将运算结果赋值给变量可以使用$[operation],但是bash shell只是支持整数运算,使用浮点数进行计算时就会报错syntax error: invalid arithmetic operator (error token is ".2+2")
# !/bin/bash
# 加法
var=$[1+2]
echo "这是加法:$var"
# 乘法
var1=$[1*2]
echo "这是乘法:$var1"
# 除法
var2=$[4/2]
echo "这是除法:$var2"
# 浮点数加法
var=$[1.2+2]
echo "这是加法:$var"
1.7 浮点数解决方案
1.7.1 bc计算器
最常见的用法是使用内建的bash计算器bc.bash计算器实际上是一种编程语言,允许命令行中间输入浮点数表达式,然后解释并计算该表达式,最后返回结果.bash计算器可以识别以下内容:
1)数字(整数和浮点数)
2)变量(简单的变量和数组)
3)注释(#或是c语言的/**/开始的行
4)表达式
5)编程语句(if-then)
6)函数
支持识别浮点数,使用quit退出bc计算器.
浮点数运算是由内建变量scale来控制的,控制计算结果的小数位.并且bc计算器支持变量,可以使用print打印变量和数字.同时使用bc -q,可以跳过冗长的欢迎信息.
1.7.2 在脚本中使用bc计算器
可以使用命令替换的方式来执行bc命令,将输出结果赋值给变量
格式:
variable=$(echo "options;expression"|bc)
options表示要设置的变量,这个变量可以是多个,用;来分隔它们.expression定义了要执行的数学表达式.
# !/bin/bash
# bc计算器
res=$(echo "scale=4;var1=20;var2=10.0;var3=3.5;var1/var2+var3"|bc)
echo $res
expression表达式可以使用shell当中的变量,当然bc计算器里面的变量.仅是在bc中间起到效果.但是此时调用变量就要按照shell的语法规则行事,$变量名
# !/bin/bash
var1=20
var2=10.0
var3=3.5
# bc计算器
res=$(echo "scale=4;$var1/$var2+$var3"|bc)
echo $res
如果存在大量的计算,一个命令行中间列出多个表达式容易让人感觉头晕.就可以使用内联输入重定向来解决这个问题.
格式:
variable=$(bc<<EOF
options
statements
expressions
EOF)
# !/bin/bash
# bc计算器之内联重定向
var1=20
var2=10.0
var3=3.5
res=$(bc<<EOF
var4=3.6
scale=4
a1=$var1/$var2
b1=$var3+var4
a1+b1
EOF)
echo "bc计算器输出结果为: $res"
1.8 退出脚本
1.8.1 查看退出状态码
shell中每个命令都是用退出状态码来告诉shell自己已经运行完毕.退出状态码是0~255的整数值.命令结束时会传递给shell,并且可以获取到这个值在脚本中使用.$?中间存储着最后一个已执行命令的退出状态码.成功的命令,退出状态码是0,错误结束的命令,退出状态码是个整数.
1.8.2 exit命令
exit命令允许脚本结束时指定一个退出状态码 ,退出状态码是在0~255之间,如果退出状态码超过这个范围,结果就是为值/256得到的余数.
1.9 实战
编写一个shell脚本计算两个日期之间的天数,允许用户以date命令能识别的任何形式来指定日期.
mac系统和linux系统的形式并不相同,使用date -d "2024-02-21"无法执行,使用下面形式进行替换.
# !/bin/bash
# 编写一个shell脚本计算两个日期之间的天数,允许用户以date命令能识别的任何形式来指定日期
date1="2024-02-21"
date2="2024-03-21"
time=$(date -j -f "%Y-%m-%d" "$date1" +%s)
time2=$(date -j -f "%Y-%m-%d" "$date2" +%s)
echo $time
echo $time2
time3=$[$time2-$time]
echo "两个时间差额的秒数: $time3"
day=$(echo "$time3/24/60/60"|bc)
echo $day
2.结构化命令
2.1 if-then语句
格式:
if command
then
commands
fi
格式2:
if command;then
commands
fi
# !/bin/bash
if pwd &> /dev/null;
thenecho "it worked"
fi
2.2 /dev/null
if后面的command成功运行,退出状态码为0,就会执行then语句,在这里使用了&>/dev/null,
/dev/null
是一个特殊的设备文件,它会丢弃所有写入它的数据,读取它会立即返回文件结束(EOF)
2.2.1 丢弃命令的标准输出:
command > /dev/null
2.2.2 同时丢弃命令的标准输出和标准错误:
command &> /dev/null
2.2.3 只丢弃命令的标准错误
command 2> /dev/null