0. 什么是 Shell 脚本
shell 脚本就是将完成一个任务的所有命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限
1. 基本的 Shell 脚本
① 整体准备
在 vim 中第一行定义脚本执行环境(#!是一个组合,不是注释)
#!/user/bin/bash
在 vim 中最后一行可以返回执行结果
exit n(n为数字,其中 0 表示正常)
给予执行权限(不这样的话,需要使用解释器,如 bash <脚本名称>)
chmod 700 <脚本名称>
注释使用 #进行单行注释
多行注释使用 <<EOF
这里是注释掉的内容
EOF
其中 EOF 可用其他符号代替,如:<<ice
这里是注释掉的内容
ice
② 变量
注意: 变量名和等号之间不能有空格
定义与取值,变量可重复定义
user_name="IceClean"
$user_name 或 ${user_name}
定义为只读变量
readonly user_name
删除变量(但不能删除只读变量)
unset user_name
变量类型
1) 局部变量:在脚本中定义,只在当前 shell 有效,其他 shell 无法访问
2) 环境变量:所有的程序都能访问
3) shell 变量:由 shell 程序设置的特殊变量,一部分为局部,一部分为环境
字符串:可以不使用引号,也可以用单引号和双引号
单引号中所有字符原样输出,不接受转义字符,所以单独单引号不允许出现,出现了无法转义
双引号支持转义字符
字符串间可随意拼接,不需要使用加号
字符串操作
1) 获取字符串长度:${#user_name}
2) 提取子字符串:${user_name:1:4}(输出 ceCl)
3) 查找子字符串:`expr index "$username" <字符串>`
注意:外层为反单引号(飘号),输出的索引从 1 开始
数组:只支持一维数组,并且数组长度没有限制
定义数组:使用括号括起来,使用空格分开;也可以单独定义,下标可以不连续没限制
array_name=("a1" "a2" "a3" ...)
array_name[0]=a0
读取数组,可指定下标与读取所有元素
${array_name[0]}
${array_name[@]}
获取数组长度
${#array_name[@]} 或者 ${#array_name[*]}
③ 函数
格式如下
function name() {
# 程序段
}
如果有参数的话啊,直接使用 ${1}, ${2} 获取,而不能在括号中声明形参
另外,函数声明必须位于使用之前
可以加 return 返回结果,不加则返回最后一条语句的执行结果
④ 常用符号
取值符号 $
取变量值:$user 或 ${user}
其中加花括号可以与其他字符区分开来避免误判,如 ${user}Name
取参数值:${0},${1}
花括号里带数字为获取参数值,其中 0 获取到的是命令的名字,之后为参数
其他用途
1) $@ :获取全部参数的值,加双引号时("$@")输出的所有参数都带双引号
2) $* :与 $@ 相同,只是加双引号("$*")输出的所有参数放在一个双引号中
3) $# :获取到参数的个数
4) $$ :获取脚本运行的进程id号
3) $? :获取到运行结果,也就是 exit n 中的 n 值
判断符号 []
[ "值1" == "值2" ]
注意:值1和值2两边都存在空格,且最好用双引号括起来,避免有带空格的值导致误判
可通过后边加 && 实现值相等执行目标指令
若有多个条件,可以使用 [ "值1" == "值2" -o "值3" == "值4" ]
基本运算
`expr 2 + 3 \* 2` 输出 8
注意:表达式使用反单引号(飘号)括起来,数字和运算符之间需要由空格
注意:乘号*前需要加反斜杠\
关系运算(只支持数字,不支持字符串)
1) -eq 判断是否相等:[ 2 -eq "2" ] 返回 true
2) -ne 判断是否不等:[ 2 -ne "2" ] 返回 false
3) -gt 判断是否大于:[ 2 -gt 1 ] 返回 true
4) -lt 判断是否小于:[ 2 -lt 1 ] 返回 false
5) -ge 判断大于等于:[ 2 -ge 2 ] 返回 true
6) -le 判断小于等于:[ 2 -ge 0 ] 返回 false
布尔运算
1) !:非运算,[ ! false ] 返回 true
2) -o:或运算,[ true -o false ] 返回 true
3) -a:与运算,[ true -a false ] 返回 false
逻辑运算
1) ||:逻辑或,[ true || false ] 返回 true
2) &&:逻辑与,[ true && false ] 返回 false
字符运算
1) =:判断字符是否相等,[ "a" = "b" ] 返回 false (加上 ! 为判断不等)
2) -z:判断长度是否为 0,[ -z "" ] 返回 true
3) -n:判断长度不为 0,[ -n "" ] 返回 true (注意:是变量就需要加双引号 "$name", 否则一直为 true)
3) $:判断字符串是否为空,[ $"" ] 返回 false
⑤ 常用指令
输出
echo -选项
-n:不要换行(默认会换行)
-e:接收转义字符(\n 换行,\b 删掉前一个字符)
printf <字符串> 参数
1) %s:给予字符串参数,没有时默认 NULL
2) %d:给予整型,没有是默认 0
3) %f:给予浮点型,没有时默默 0.000000
4) -:表示左对齐,没有时默认右对齐
5) -n.m:n、m 为数字,表示保留 n 个字符,m 位小数(浮点型有)
输入
read -选项 <变量名>
-s:不显示输入内容
-t:后边接数字,表示在多少秒后中止输入
-n:后边接数字,表示最多输入多少位
-p:后边接字符串,为提示输入的信息
2. 控制语句
① 条件判断
if 格式:
if [ 条件判断式一 ]; then
`条件一成立执行的内容`
elif [ 条件判断式二 ]; then
`条件二成立执行的内容`
else
`条件都不成立执行的内容`
fi
case 格式
case $变量 in
"值1")
`值1 成立时执行`
;; `注意是两个分号`
"值2")
`值2 成立时执行`
;;
*)
`所有值都不成立时执行`
;;
esac
② 循环
条件循环格式
while [ 条件判断式 ]
do
`条件成立时执行`
done `循环的结束`
until [ 条件判断式 ]
do
`条件不成立时执行,也就是直到条件成立时才停止`
done
for <变量> in <值1> <值2> ... <值n>; do
`当变量在值列表中时执行`
done
例:
for str in My name is IceClean; do
echo $str
done
输出:
My
name
is
IceClean
还可以像其他语言那样,使用
for((i=0; i<=5; i++)); do
`满足条件时执行`
done
3. 输入输出重定向
输出重定向
将命令输出内容保存到文件中
command > file
注意: file 中原先的内容将被清空,新内容进行了取代
使用 >> 不会覆盖,而是以追加的方式写入
输入重定向
从文件中获取内容作为输入
command < file
文件描述:
- 标准输入文件 stdin 的文件描述符为 0,程序默认从 stdin 读取数据
- 标准输出文件 stdout 的文件描述符为 1,程序默认向 stdout 输出数据
- 标准错误文件 stderr 的文件描述符为2,程序默认向 stderr 流中写入错误信息
command 2>file
表示将错误信息输出到指定文件中
云海之下,藏匿了亘古传说(IceClean)