shell脚本
- shell脚本
- shell脚本编写
- 变量的定义
- 变量的使用
- 变量值调换
- 引号的使用
- 环境变量
- 输出全局变量
- 只读变量
- 位置变量
- 预定义变量
- 条件判断操作
- if语句
- case语句
- for语句
- while语句
- until语句
- 退出循环
- sleep循环等待时间
- shift 去除第一个位置变量参数
- ${} $变量的特殊显示方式
- echo用法
shell脚本
shell脚本编写
1)创建shell脚本文件
- 文件名格式 一般以 .sh 后辍结尾
2)编写shell脚本
-
#!/bin/bash 声明解释器
-
再做脚本注释 以#号开头都为注释
-
编写脚本代码
3)执行shell脚本
-
以绝对/相对路径执行脚本文件,执行脚本文件的用户需要有执行权限 chmod +x
-
sh / bash 指定脚本文件执行 (在子环境中执行脚本)
-
source / . 指定脚本文件执行(在当前的shell环境中执行脚本)
变量的定义
-
1)变量名=变量值
-
2)read -p “提示信息” 变量名
变量的使用
- ${变量名} 可以控制变量名的范围
变量值调换
a=10
b=20
c=$a
a=$b
b=$c
引号的使用
-
’ ’ 会把所有字符当做普通字符看待
-
" " 会把一些符号当做特殊字符使用,比如$,会引用变量的值
-
`` 获取双撇号里的命令执行结果,效果等同于 $( )
环境变量
-
PATH LANG PWD HOME HISTSIZE USER 常用的环境变量
-
env 命令查看当前shell环境有哪些环境变量
输出全局变量
-
vim /etc/profile
-
export 变量名=变量值
只读变量
- readonly 变量名=变量值
位置变量
-
$0 脚本本身
-
$1 - $9 脚本后跟的以空格间隔的位置参数
-
${10} 第十个的时候需要加上大括号不然会被当做$1和0的组合
预定义变量
-
$ ∗ 脚本后面跟的所有参数,使用双引号” * 脚本后面跟的所有参数,使用双引号” ∗脚本后面跟的所有参数,使用双引号”*“会把所有参数看做为一个整体
-
$ @ 脚本后面跟的所有参数,使用双引号” @ 脚本后面跟的所有参数,使用双引号” @脚本后面跟的所有参数,使用双引号”@“会把所有参数看做作为一个个以空格间隔的个体
-
$# 脚本后面跟的所有参数的数量
-
$?返回上一条命令执行的状态码,0为上一条命令执行正常,其他非零值为执行异常
条件判断操作
-
test [选项] [表达式]
-
[ 选项 表达式 ]
-
选项
- -e 目录或文件是否存在
- -d 是否为目录,也可判断目录是否存在
- -f 是否为文件,也可判断文件是否存在
- -r 是否拥有读取权限
- -w 是否拥有写入权限
- -x 是否拥有执行权限
- -L 是否为符号链接文件,也可判断链接文件是否存在
-
整数值比较符号
- -eq 等于 ==
- -ne 不等于 !=
- -gt 大于 />
- -ge 大于等于
- -lt 小于
- -le 小于等于
使用符号比较时 需要 (( 100 != 90 ))使用 双括号
- 字符串比较 (在比较字符串的时候用双引号 “$i” )
- ==/= 等于
- != 不等于
- -z “字符串” 检查字符串是否为空,对于未定义或赋予空值的变量将视为空串,空则成功
- -n “字符串” 检查字符串是否有内容,有字符则成功
- 逻辑运算符
- && (-a) 逻辑并且
- [ 表达式A ] && [ 表达式B ]
- [ [ 表达式A && 表达式B ] ]
- [ 表达式A -a 表达式B ]
- || (-o) 逻辑或
- [ 表达式A ] || [ 表达式B ]
- [ [ 表达式A || 表达式B ] ]
- [ 表达式A -o 表达式B ]
- 命令A && 命令B
- 命令A执行成功才会执行命令B
- 命令A || 命令B
- 命令A 执行成功不执行命令B,命令A失败则执行命令B
- && (-a) 逻辑并且
- 三元运算符
- 表达式 ? 值A : 值B
- 表达式成立取:前的值A,不成立则取:后值B
- 表达式 && 命令A || 命令B
- 表达式成立执行命令A ,不成立则执行命令B
- 表达式 ? 值A : 值B
if语句
-
if [ 表达式 ]
-
if test 表达式
-
if 命令A
- then (if判断成功则执行then)
- 代码块
- elif [ 表达式 ] (if判断失败则执行elif或else)
- then;代码块
- elif [ 表达式 ] ;then; …… #可以跟多个elif
- else (else为否则的意思 前面的判断条件都不成立时执行else)
- 代码块
- then (if判断成功则执行then)
-
fi #固定结束格式
-
;可以被看做换行符可以写成
- if 命令;then;代码块;fi
case语句
- case 变量值($变量名) in
- 模式1)
- 代码块1
- ;;
- 模式2)
- 代码块2
- ;;
- 模式3)
- 代码块3
- ;;
- *)
- 以上都不满足执行 * 内的代码块,* 为可选项
- esac
- 模式表达式要么为字符串,要么为通配符
- read -p “请输入你的分数” num
- case $num in
- 100)
- echo “完美”
- ;;
- 9[0-9])
- echo “优秀”
- ;;
- [678] [0-9])
- echo “很棒”
- ;;
- [0-9] | [1-5] [0-9])
- echo “还需要努力”
- ;;
- esac (固定格式结尾)
for语句
for循环就是一个遍历的过程
-
for 变量 in 取值列表
-
do
- 代码块
-
done
-
for ((变量=初始值;变量的范围;变量的迭代方式))
- for ((i=1;i<=10;i++))
- for ((;;)) #死循环
while语句
-
while [ 表达式 ]
-
do
- 代码块(条件判断成立时循环执行的代码块)
- 变量的迭代方式,如果不添加会死循环一值执行
-
done
until语句
-
until [ 表达式 ]
-
do
- 代码块(条件判断不成立时循环执行的代码块,条件成立时结束循环)
- 变量的迭代方式,如果不添加会死循环一值执行
-
done
退出循环
-
break 默认用于退出单层循环
- break 2 退出两次循环
-
continue 用于终止某次遍历的执行,不会影响之后的循环(遍历变量每次被赋值循环的过程称为遍历)
- continue 2 不仅终止当前遍历的执行,还会终止 外面一层循环的遍历过程。
-
exit 退出脚本的执行状态
- exit 结束的脚本, $? 的返回值为0
- exit 1 结束脚本 ,$? 的返回值为1,1可以换做所有非0的数
sleep循环等待时间
- sleep n 秒 当循环执行到此命令时等候n秒在继续执行循环
shift 去除第一个位置变量参数
- shift 命令可以去除第一个位置变量参数
${} $变量的特殊显示方式
- i=192.168.55.44
- ${i:2:2} :从变量i的下标2开始(下标从左到右从0开始依次增加),取三个数
- 就是 2.1
- ${ i%%.*} :从右往左删除直到最后一个 点 为止,只取剩余内容
- 就是192
- ${ i%.*} :从右往左删除直到遇见第一个 点 停止,取剩余内容
- 就是192.168.55
- ${ i#*.} :从左往右删除直到遇见第一个 点 停止,取剩余内容
- 就是168.55.44
- ${ i##*.} :从左往右删除直到最后一个 点 为止,取剩余内容
- 就是44
echo用法
-n :不换行输出
-e :解释转义字符
-E :不解释转义字符
\a :发出警告声
\b :转移后相当于退格键(backspace/删除键),但前提是“\b”后面存在字符;“\b”表示删除前一个字符,“\b\b”表示删除前两个字符。
\c : 不换行输出,在 “\c” 后面不存在字符的情况下,作用相当于 echo -n ,但是当 “\c”后面任然存在字符时,“\c” 后面的字符将不会被输出
\e :escape,相当于\033
\E :作用相当于\e
\f :换行,但下一行内容起始位置和上一行从 \f 处换行的位置对齐
\n :换行且光标移至首行
\r :换行字符,光标移至行首,输出 \r 后面的内容
\t :表示插入tab,即横向制表符
\v :换行,但下一行内容其实位置和上一行从 \v 处换行的位置对齐
\ :表示插入反斜杠本身