【笔记】Shell学习笔记

前言

Unix shell,一种壳层与命令行界面,是UNIX操作系统下传统的用户和计算机的交互界面。第一个用户直接输入命令来执行各种各样的任务。(维基百科

运行脚本

<file>:脚本名

直接执行

  • 附加执行权限,直接执行
1
2
chmod +x <file>.sh
./<file>.sh

使用对应解释器执行

1
sh <file>.sh

以debug方式运行

1
sh -x <file>.sh

查看系统支持的解释器

1
cat /etc/shells

Shell中的特殊符号

  • ~:家目录
  • !:执行历史命令
  • $:取变量的内容
  • +-*/%:数学运算符
  • &:后台执行
  • *:通配符,匹配任意个任意字符
  • ?:通配符,匹配一个任意字符
  • ;:分隔两条命令
  • \:转义字符
  • 
    
  • '':单引号,用于括起来字符串。与双引号不同的是,单引号不解释变量
  • "":双引号,用于括起来字符串
  • '''':双单引号,相当于双引号,可以解释变量的字符串

定义解释器

  • 在脚本第一行定义Shell解释器(我这里使用的是zsh)
1
#!/bin/sh

定义脚本说明

  • 定义脚本的作者、时间、版本号、描述
1
2
3
4
# Author: FeiJu
# Created Time: 2021/10/10 10:10
# Release: 1.0
# Script Description: This is a Shell script

注释

1
# 注释内容

输出语句

  • 通过echo将一段文字输出到屏幕

-n:输出不换行
-e:遇见转义字符进行转义

\a:发出警告声
\b:删除前一个字符
\c:最后不加上换行符号
\v\f:换行但光标仍旧停留在原来的位置
\n:换行且光标移至行首
\r:光标移至行首,但不换行
\t:插入制表符
\:插入反斜线
\<num>:插入对应ASCII值的字符

-help:查看帮助
-version:查看版本

1
echo 文本内容

输入语句

-p <str>:输入事的提示文字
-t<num>:设置超时时间
-s:不回显
-n<num>:限定输入的字符数

1
read

输入后存到一个变量

1
read 变量名

变量

系统内置变量

变量
$0 当前命令名
$1$2、…、${10}、… 第1个参数、第2个参数、…、第10个参数、…
$# 参数总个数
$* 将所有参数保留IFS拼接为一个字符串
$@ 将所有参数不保留IFS拼接为一个字符串
$$ 当前Shell进程的PID
$PPID 当前Shell父进程的PID
$! 上一个后台运行进程PID
$? 上一条命令退出返回的状态码

定义变量

  • 变量名尽量大写
1
2
3
变量名=变量值

let 变量名=变量值

获取变量

1
$变量名

变量自增

1
$变量名++

运算符

算数运算符

  • +(加号)、-(减号)、*/%**(乘方)
  • ++(自增)、--(自减)
1
echo $(( 10 + 3 ))

关系运算符

  • 返回0表示真,返回1表示假

    • 返回的是字符串,继续参与算数运算不能得到运算结果而是字符串拼接
  • 如果没有在当前语句中使用关系运算结果,可以在下一条命令中通过$?获取上一条命令关系运算结果

  • 通过(())进行算数运算

    • ><>=<===!=
1
echo $(( $变量名 == $变量名 ))
  • 通过[]进行条件测试
    • -eq-ne-gt-lt-ge-le
1
2
[ $变量名 -eq $变量名 ]
echo $?

逻辑运算符

  • &&||!
1
2
[ $变量名 -eq $变量名 ] && [ $变量名 -eq $变量名 ]
echo $?
1
2
[ ! $变量名 -eq $变量名 ]
echo $?

赋值运算符

  • =+=-=*=/=%=

按位运算符

  • &|^~<<>>
1
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
1
2
1) 选项1  2) 选项2
?# 1

break关键字

  • 跳出循环
1
2
3
4
while [ 1 ]
do
break
done

continue关键字

  • 结束当前循环,开始下一次循环
1
2
3
4
while [ 1 ]
do
continue
done

三元运算

1
echo $(( 布尔表达式 ? 布尔表达式成立时返回的结果 : 布尔表达式不成立时返回的结果 ))

重定向

输出重定向

  • 将命令执行结果输出到文件

覆盖输出

1
<shell> > <file>

追加输出

1
<shell> >> <file>

输入重定向

文件内容作为stdin

1
<shell> < <file>

单行字符串作为stdin

1
<shell> <<< "文本内容"

多行字符串作为stdin

  • 将文本内容作为命令输入参数输入,每行表示一个参数

EOF:结束符,可以自定义,只要保证开始和结尾一样即可,没有引号包裹的结束符,内容出现的变量被解析为值,没有-作为结束符前缀,内容出现的缩进不会被自动删除

1
2
3
<shell> <<EOF
文本内容
EOF

"EOF":有引号包裹的结束符,内容出现的变量不会被解析为值

1
2
3
<shell> <<"EOF"
文本内容
EOF
  • -EOF:以-作为结束符前缀,内容出现的缩进被自动删除
1
2
3
<shell> <<-EOF
文本内容
EOF

屏蔽输出

屏蔽标准输出

1
<shell> 1>/dev/null
  • 简写
1
<shell> >/dev/null

屏蔽错误输出

1
<shell> 2>/dev/null

屏蔽标准输出和错误输出

1
<shell> > /dev/null 2>&1

管道符

  • 前面命令的输出作为后面命令的输入
1
<shell_1> | <shell_2>

终止程序

  • 退出码取值范围为[0,255],如果超出取值范围会自动对255取模
1
exit 0

完成

参考文献

哔哩哔哩——Python社区
哔哩哔哩——千锋教育网络安全学院