一、shell的概述
1、shell本质是脚本文件:完成批处理。
shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行。shell 脚本主要用于帮助开发人员或系统管理员将复杂而又反复的操作放在一个文件中,通过简单的一步执行操作完成相应任务,从而解放负担。
2、shell 是软件也是语言。
软件:作为shell命令解析器(如sh、ash、bash(默认)),将脚本文件逐行解析执行。
语言:shell脚本语言,符合解析器的规则。它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署。
3、系统默认调用的两个脚本文件
这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile、~/.bashrc等
/etc/profile:对系统的所有用户都有效,系统的公共环境变量在这里设置。用户登录系统的时候 执行。
~/.bashrc:用户自己的家目录中的.bashrc,对登录的用户有效,一般设置与个人用户有关的环境变量。用户登录、打开终端时调用。
以修改 ~/.bashrc为例:
家目录下能找到.bashrc
输入vim .bashrc命令:
在最后编辑打印echo "hello world" :
保存并退出
重新打开终端如图所示:
3、写脚本的步骤
第一步:#!/bin/bash(#!表示指明脚本命令解析器用bash)
第二步:写脚本,如echo "hello world"
第三步:给脚本增加 可执行权限:chmod +x 脚本文件
(u+x:所拥有者+x、g+x:同组用户+x、0+x:其他用户+x)
第四步:执行脚本文件
三种执行方式:
./00_shell.sh 首先检测#!,使用#!指定的shell,如果没有使用系统默认的shell命令解释器
. 00_shell.sh 不检测#!,使用系统当前shell读取解释00_shell.sh
bash 00_shell.sh 不检测#!,直接指定使用bash解释00_shell.sh
用./和 bash去执行会在后台启动一个新的shell去执行脚本
用.去执行脚本不会启动新的shell,直接由当前的shell 去解释执行脚本。
如果因格式导致执行shell出错,解决方法:
方法一:
sudo apt‐get install dos2unix
dos2unix 脚本文件
方法二:
用vim打开脚本,在最后一行模式下执行
:set ff=unix(指明为unix文件格式)
二、shell的自定义变量
1、定义变量
变量名=变量值,如num=10(无需标识数据类型及分号)
2、引用变量
$变量名,如i=$num(把变量num的值赋给i)
3、清除变量
使用unset命令,如unset num(将num变量清除)
4、只读变量
4、shell的变量 获取键盘输入read
三、环境变量
1、将脚本变量导出为环境变量
查看系统所有的环境变量:输入命令env
脚本导出为系统环境变量:
输入env命令查看:
2、变量的注意事项
(1)命名规则
变量名由字母、数值、下划线组成 不能以数值开头 不能是关键字。
(2)变量使用注意点
#等号两边不能直接接空格符
num = 10 #错误
num=10 #正确
#若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来
num=10 20 30 #错误
num="10 20 30"#正确
num='10 20 30'#正确
双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
(3) unset命令清除环境变量
3、修改和追加环境变量的值
四、预设变量
- $#:传给shell脚本参数的数量
- $*:传给shell脚本参数的内容
- $1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
- $?:命令执行后返回的状态
- "$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执 行,任何非0值表示命令出错)。
- $0:当前执行的进程名
- $$:当前进程的进程号
- "$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
五、shell脚本的特殊用法
`(数字键1左边的反引号):反引号中的内容作为系统命令,并执行其内容。
\ 转义字符: 同c语言 \n \t \r \a等 echo命令需加-e转义
(命令序列): 由子shell来完成,不影响当前shell中的变量
{ 命令序列 }: 在当前shell中执行,会影响当前变量
六、条件测试
1、条件测试的语法
语法1:使用关键字 test
test condition(条件表达式+文件名)
语法2:使用[]里面左右有空格
[ condition(条件表达式+文件名) ]
2、文件测试
测试文件状态的条件表达式:
-e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行
-L 符号连接 -c是否字符设备 -b是否块设备 -s 文件非空
3、字符串测试
单目:
test str_operator(shell比较符) “str”
[ str_operator(shell比较符) “str” ]
双目:
test “str1” str_operator(shell比较符) “str2”
[ “str1” str_operator(shell比较符) “str2”]
其中str_operator(shell比较符)可以是: = 两个字符串相等 != 两个字符串不相等 z 空串 n 非空串
字符串操作扩展:(在bash命令解释器下)
4、数值测试
test num1 num_operator(shell比较符) num2
[ num1 num_operator(shell比较符) num2 ]
num_operator(shell比较符)可以是:
-eq | equal | 相等 |
-ne | not equal | 不相等 |
-gt | greater than | 大于 |
-ge | greater equal | 大于等于 |
-lt | less than | 小于 |
-le | less equal | 小于等于 |
数值的扩展:
5、复合测试
command1 && command2
&&左边命令(command1)执行成功(即返回0)shell才执行&&右边的命令(command2)
command1 || command2
||左边的命令(command1)未执行成功(即返回非0)shell才执行||右边的命令 (command2)
案例:test -f test.c && test -r test.c && test -w test.c
或:
-a | (and)是否两状况同时成立 test -r file -a -x file file同时具有r和x权限时返回true |
-o | (or)是否两状况任意一个成立 test -r file -o -x file ile具有r或x权限时返回true |
! | 相反状态 test !-x file 当file不具备x时返回true |
案例:test -f test.c -a -r test.c -a -w test.c
七、控制语句
1、if控制语句
格式一:(if和条件后有英文空格,fi为结束标志)
if [ 条件 ]; then
执行第一段程序
else
执行第二段程序
fi
例:查看当前某个文件是否存在 如果存在打印结果并查看文件内容 不存在 创建该文件,赋值内容并输出内容
格式二:
if [条件1];then
执行第一段程序
elif [条件2];then
执行第二段程序
else 执行第三段程序
fi
2、case控制语句
case $变量名称 in
“第一个变量内容”)
程序段一
;;
“第二个变量内容”)
程序段二
;;
*)
其它程序段
exit 1
esac
3、for循环语句
形式一:
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
declare 是bash 的一个内建命令,可以用来声明shell变量、设置变量的属性。declare也可以写作typeset,declare -i s代表强制把s变量当做int型参数运算。
以一百内数相加为例:
形式二:
for var in con1 con2 con3 ...
do
程序段
done
(第一次循环时,$var的内容为con1)
(第二次循环时,$var的内容为con2)
( 第三次循环时,$var的内容为con3)
实际案例:扫描当前目录的文件
4、while循环语句
while [ condition ]
do
程序段
done
(当condition成立的时候进入while循环,直到condition不成立时才退出循环 )
5、until循环控制语句
until [ condition ]
do
程序段
done
(这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环 )
八、函数
有些脚本段间互相重复,如果能只写一次代码块而在任何地方都能引用那就提高了代码的可 重用性。 shell允许将一组命令集或语句形成一个可用块,无返回值类型及参数,这些块称为shell函数
格式一:
函数名() {
命令 ...
}
格式二:
function 函数名() {
命令 ...
}
(function显示标识为函数)
案例1:封装一个函数计算两个数据的和
案例2:分文件函数