116186469086580225
前言
Unix shell,一种壳层与命令行界面,是UNIX操作系统下传统的用户和计算机的交互界面。第一个用户直接输入命令来执行各种各样的任务。(维基百科)
运行脚本
<file>:脚本名
直接执行
1 2
| chmod +x <file>.sh ./<file>.sh
|
使用对应解释器执行
以debug方式运行
查看系统支持的解释器
Shell中的特殊符号
~:家目录
!:执行历史命令
$:取变量的内容
+、-、*、/、%:数学运算符
&:后台执行
*:通配符,匹配任意个任意字符
?:通配符,匹配一个任意字符
;:分隔两条命令
\:转义字符
'':单引号,用于括起来字符串。与双引号不同的是,单引号不解释变量
"":双引号,用于括起来字符串
'''':双单引号,相当于双引号,可以解释变量的字符串
定义解释器
- 在脚本第一行定义Shell解释器(我这里使用的是zsh)
定义脚本说明
1 2 3 4
| # Author: FeiJu # Created Time: 2021/10/10 10:10 # Release: 1.0 # Script Description: This is a Shell script
|
注释
输出语句
-n:输出不换行
-e:遇见转义字符进行转义
\a:发出警告声
\b:删除前一个字符
\c:最后不加上换行符号
\v、\f:换行但光标仍旧停留在原来的位置
\n:换行且光标移至行首
\r:光标移至行首,但不换行
\t:插入制表符
\:插入反斜线
\<num>:插入对应ASCII值的字符
-help:查看帮助
-version:查看版本
输入语句
-p <str>:输入事的提示文字
-t<num>:设置超时时间
-s:不回显
-n<num>:限定输入的字符数
输入后存到一个变量
变量
系统内置变量
| 变量 |
值 |
$0 |
当前命令名 |
$1、$2、…、${10}、… |
第1个参数、第2个参数、…、第10个参数、… |
$# |
参数总个数 |
$* |
将所有参数保留IFS拼接为一个字符串 |
$@ |
将所有参数不保留IFS拼接为一个字符串 |
$$ |
当前Shell进程的PID |
$PPID |
当前Shell父进程的PID |
$! |
上一个后台运行进程PID |
$? |
上一条命令退出返回的状态码 |
定义变量
获取变量
变量自增
运算符
算数运算符
+(加号)、-(减号)、*、/、%、**(乘方)
++(自增)、--(自减)
关系运算符
1
| echo $(( $变量名 == $变量名 ))
|
1 2
| [ $变量名 -eq $变量名 ] echo $?
|
逻辑运算符
1 2
| [ $变量名 -eq $变量名 ] && [ $变量名 -eq $变量名 ] echo $?
|
1 2
| [ ! $变量名 -eq $变量名 ] echo $?
|
赋值运算符
按位运算符
分支语句
if
1 2 3
| if [ 布尔表达式 ] then 布尔表达式成立时执行的命令 fi
|
1 2 3 4 5
| if [ 布尔表达式 ]; then 布尔表达式成立时执行的命令 else 布尔表达式不成立时执行的命令 fi
|
1 2 3 4 5 6 7
| if [ 布尔表达式1 ]; then 布尔表达式1成立时执行的命令 elif [ 布尔表达式2 ]; then 布尔表达式2成立时执行的命令 else 以上布尔表达式都不成立时执行的命令 fi
|
1 2 3 4 5
| if [ 布尔表达式1 ] then if [ 布尔表达式2 ] then 布尔表达式1和2都成立时执行的命令 fi fi
|
case…in语句
1 2 3 4 5 6 7 8 9 10 11
| case $变量名 in 值1) 变量值为值1时执行的命令 ;; 值2) 变量值为值2时执行的命令 ;; *) 变量值不为以上任何值时执行的命令 ;; esac
|
循环语句
while语句
1 2 3 4
| while [ 布尔表达式 ] do 布尔表达式成立时反复执行的命令 done
|
util语句
1 2 3 4
| until [ 布尔表达式 ] do 布尔表达式不成立时反复执行的命令 done
|
for语句
1 2 3 4
| for (( i=起始值; 布尔表达式; i++ )) do 布尔表达式成立时反复执行的命令 done
|
for…in语句
1 2 3 4
| for i in $变量名 do 布尔表达式成立时反复执行的命令 done
|
select语句
1 2 3 4
| select i in 选项1 选项2 do 反复执行的命令 done
|
break关键字
1 2 3 4
| while [ 1 ] do break done
|
continue关键字
1 2 3 4
| while [ 1 ] do continue done
|
三元运算
1
| echo $(( 布尔表达式 ? 布尔表达式成立时返回的结果 : 布尔表达式不成立时返回的结果 ))
|
重定向
输出重定向
覆盖输出
追加输出
输入重定向
文件内容作为stdin
单行字符串作为stdin
多行字符串作为stdin
EOF:结束符,可以自定义,只要保证开始和结尾一样即可,没有引号包裹的结束符,内容出现的变量会被解析为值,没有-作为结束符前缀,内容出现的缩进不会被自动删除
"EOF":有引号包裹的结束符,内容出现的变量不会被解析为值
1 2 3
| <shell> <<"EOF" 文本内容 EOF
|
-EOF:以-作为结束符前缀,内容出现的缩进会被自动删除
1 2 3
| <shell> <<-EOF 文本内容 EOF
|
屏蔽输出
屏蔽标准输出
屏蔽错误输出
屏蔽标准输出和错误输出
1
| <shell> > /dev/null 2>&1
|
管道符
终止程序
- 退出码取值范围为[0,255],如果超出取值范围会自动对255取模
完成
参考文献
哔哩哔哩——Python社区
哔哩哔哩——千锋教育网络安全学院