文章目录
1、什么是shell脚本
shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。
2、书写一个shell脚本
(1)shell脚本的命名:
名字要有意义,方便后续知道该脚本的作用。在Linux下文件没有扩展名的概念,但是依然建议你用.sh结尾;名字不要太长,最好能在30个字节以内解决。例如:check_memory.sh
(2)shell脚本格式:
shell脚本开头必须指定脚本运行环境 ,以 #! 这个特殊符号组合来组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的;
shell中使用#来注释
#!/bin/bash #指定该脚本的解析器
echo hello shell
(3)运行shell脚本:
1)给shell脚本运行权限
chmod u+x filename.sh
./filename.sh
2) 如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予执行权限的脚本
bash filename.sh
3、shell中特殊符号
符号 | 含义 |
---|---|
~ | 家目录,例如cd ~ 表示进入用户家目录 |
! | 执行历史命令,例如!! 执行上一条命令,! 25 执行历史命令中的25行命令 |
$ | 取变量的值,例如 echo $PATH 输出PATH变量的值,echo $SHELL 输出当前shell变量的值 |
+ - * / % | 对应数学运算中的加减乘除取余 |
& | 单一个&符号,且放在完整指令的最后端,表示将该指令放入后台工作 |
* | 通配符,匹配所有字符 |
? | 通配符,匹配回车以外的单个字符 |
; | 可以在shell中一行执行多个命令,命令之间用分号分割 |
| | 管道符 ,上一个命令的输出作为下一个命令的输入 例如:cat filename | grep xx |
\ | 转义字符 |
` ` | 反引号,命令中执行命令。例如:echo "today is 反引号date 反引号" 。看下面例1。 |
'' | 单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量。看下面例2 |
"" | 双引号,脚本中出现的字符串可以用双引号引起来,双引号中的变量会被解释替换。看下面例2 |
$? | 上一条命令的退出状态或者返回值。例如:查看上一条命令的返回值echo $? |
示例1:反引号括起来的字符串会被当命令处理
示例2:双引号括起来的字符串中的变量会被解释,单引号不会。下面示例中$SHELL为一个环境变量,该变量的值为当前shell的解释器
4、shell中管道的运用
|
管道符在shell中使用是最多的,很多组合命令都需要通过组合命令来完成输出。管道符其实就是将前一个命令的输出作为下一个命令的输入
5、shell重定向
-
>
:输出重定向,会覆盖原数据 -
>>
:输出重定向,在源数据末尾追加
-
<
:输入重定向。用法:命令<文件
:将指定文件作为命令的输入设备 -
<<
:用法:命令 << 分界符
:表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串
Linux下与输出输出相关比较重要的文件描述符
文件描述符 | 文件 | 类型 | 硬件 |
---|---|---|---|
0 | stdin | 标准输入 | 键盘 |
1 | stdout | 标准输出 | 显示器 |
2 | stderr | 标准错误输出 | 显示器 |
stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用。
/dev/null
:这是一个空设备,也称黑洞文件,通常用来处理进程中那些不想要的输出流。
注意:
输出重定向的完整写法其实是command fd>file或者command fd>>file,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。命令 >>文件
完整写法为命令 1>>文件
。当文件描述符为大于 1 的值时,比如 2,就必须写上。且fd和>或>>之间不能有空格
command > filename | 等价于command 1 > filename | 以覆盖的方式,把 command 的正确输出结果输出到 filename文件中。 |
---|---|---|
command >> filename | 等价于command 1 >> filename) | 以追加的方式,把 command 的正确输出结果输出到 filename文件中。 |
command 2 >> filename | 标准错误输出重定向 | 以追加的方式,把 command 的错误输出结果输出到 filename文件中。 |
command >file 2>&1 | 正确输出和错误信息同时保存 | 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 |
command >file 2>file | 正确输出和错误信息同时保存 | 功能与上一条相同,但是不建议使用。 区别就在于前者只打开一次文件file,后者会打开文件两次, 并导致stdout被stderr覆盖。从IO效率上来讲,使用上面的方式较好 |
command >>file 2>&1 | 正确输出和错误信息同时保存 | 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。 |
command < file1 >file2 | 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2。 |
下面看一个示例:
6、shell中的数学运算
shell中常见算术运算符
算术运算符 | 说明 |
---|---|
+ - * / % | 加、减、乘、除、取余 |
** | 幂运算。例如:echo $((2**3)),求2的三次幂 |
++ -- | 自增、自减 |
! && || | 逻辑非、且、或 |
< <= > >= == != = | 小于、小于等于、大于、大于等于、不等于、赋值 |
<< >> | 左移、右移 |
shell中常用的数学计算命令如下
运算命令 | 说明 |
---|---|
(()) | 用于整数运算,效率高。常用 |
bc | Linux下的计算器程序,可以处理整数和小数。如果计算小数的用它 |
let | 用于整数运算,和(())类似 |
$[] | 用于整数运算,不如(())灵活 |
expr | 可用于整数运算,也可以处理字符串,较为麻烦,需注意各种细节 |
(1)双小括号(())用法
((表达式)) #需手动输出,例如echo $((1+2*3))
变量=$((表达式)) #获取表达式的运算结果赋值给变量
echo $((表达式)) #直接输出结果
将表达式将在((和))之间,多个表达式之间使用逗号分隔。对于多个表达式的情况,以最后一个表达式的值作为整个(())命令的执行结果.
示例:
root@wkr:~# echo $((1+2+3)) #直接输出运算结果
6
root@wkr:~# a=$((2*3*2)) #将运算结果赋值给变量a,再次输出变量a的值
root@wkr:~# echo $a
12
root@wkr:~# echo $((a=1+2+3,b=4+5+6)) #多个表达式以逗号分隔,以最后一个表达式的值作为整个命令的运算结果
15
root@wkr:~# echo $a #上一个运算将a赋值,这里直接输出变量a的值
6
root@wkr:~# echo $((++a)) #自增运算
7
(2)bc计算器命令
在命令行下直接输入bc
即可进入到bc计算器,输入表达式可算出结果
使用scale=3来设置bc计算器小数点后保留几位
在shell下使用bc计算器呢
在shell中使用bc计算器,我们需要借助|
管道运算符,将表达式通过管道流入到bc命令 。
示例:
root@wkr:~# echo "(3+5)/2"|bc
4
root@wkr:~# echo 100/33|bc
3
root@wkr:~# echo "scale=3;100/33"|bc #保留小数点后三位
3.030
root@wkr:~# echo 1.24+3.88|bc
5.12
root@wkr:~# echo "10/3的结果为:`echo "scale=3;10/3"|bc`"
10/3的结果为:3.333
配合变量使用
root@wkr:~# i=`echo "sacle=2;1/3+1.5"|bc` #将1/3+1.5的值赋给变量i
root@wkr:~# echo $i
1.5
root@wkr:~# j=`echo "$i*100"|bc` #将变量i的值乘以100计算后的结果赋值给变量j
root@wkr:~# echo $j
150.0