shell脚本
shell的功能
Shell(壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
shell的种类
查看/etc/shells这个文件,里面就是当前Linux所包含的Shell。
[root@sunny1 gw]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
最常用的shell有:bash、tcsh、csh、sh、nologin等。
bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。
当用户登录的时候,系统就会给用户一个shell让用户使用,而这个登录获得的Shell的类型就记录在/etc/passwd这个文件内。
[root@sunny1 gw]# tail -5f /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
sl01:x:1000:1000:sl01:/home/sl01:/bin/bash
sl02:x:1001:1001::/home/sl02:/bin/bash
sl03:x:1002:1002::/home/sl03:/bin/bash
sl04:x:1003:1003::/home/sl04:/bin/bash
shell脚本的作用
shell脚本可以实现自动化运维,减轻管理员工作量,提高处理文本文件的速度,避免配置出错。用shell可以编写脚本结合计划任务自动周期运行,避免重复操作,。
shell脚本的构成
脚本通常由脚本申明和可执行语句组成,也可添加注释语句。
第一行为脚本申明。
若第一行为"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行。
#!:申明此脚本使用哪个解释器环境/解释器类型。
/bin/bash:解释器类型。
以"#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执。
shell脚本的执行
方法一:指定路径的命令(被执行文件必须有 x 权限,没有x 权限可使用chmod +x为文件添加x 权限)
指定绝对路径
[root@sunny1 /]# ./opt/99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
指定相对路径
[root@sunny1 opt]# ./99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
方法二:指定Shell来解释脚本,不要求文件必须有 x 权限。
sh 脚本路径:sh 文件名
[root@sunny1 opt]# sh sum.sh
5050
source 脚本路径:. 文件名 或者 source 文件名
[root@sunny1 opt]# source sum.sh
5050
[root@sunny1 opt]# sum=0
[root@sunny1 opt]# . sum.sh
5050
source命令也称为"点命令",也就是一个点符号(.),是bash的内部命令。
source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。因为linux所有的操作都会变成文件的格式存在。
不同命令执行脚本的区别
文件有执行权限是 sh 文件名 和 ./路径 是没有区别的。
他们是重新建立一个子shell,在子shell中执行脚本里面的语句。
该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell。
除非使用export。
[root@sunny1 opt]# cat sum.sh
#!/bin/bash
for ((i=1;i<=100;i++))
do
let sum=i+sum
done
echo "$sum"
[root@sunny1 opt]# sum=0
[root@sunny1 opt]# echo $sum
0
[root@sunny1 opt]# sh sum.sh
5050
[root@sunny1 opt]# echo $sum
0
source命令会在当前shell执行脚本,改变当前shell的环境。
[root@sunny1 opt]# source sum.sh
5050
[root@sunny1 opt]# echo $sum
5050
[root@sunny1 opt]# su
[root@sunny1 opt]# echo $sum
[root@sunny1 opt]#
shell脚本检查
bash
bash -n 脚本名称 (不在当前目录下加绝对路径)检查语法错误
[root@sunny1 opt]# bash -n js.sh
[root@sunny1 opt]# bash -n zj_ping.sh
[root@sunny1 opt]# vi zj_ping.sh
[root@sunny1 opt]# bash -n zj_ping.sh
zj_ping.sh:行9: 未预期的符号 `done' 附近有语法错误
zj_ping.sh:行9: `done'
[root@sunny1 opt]# cat zj_ping.sh
#!/bin/bash
for ((i=1;i>=0;i++))
do
ping -w 2 -c 2 $$i &> /dev/null
if [ $? -eq 0 ]
then
echo "$$i" >> ip.txt
# fi
done
bash -x 脚本名称 (不在当前目录下加绝对路径)检查逻辑错误
[root@sunny1 opt]# bash -x zj_ping.sh
+ (( i=1 ))
+ (( i>=0 ))
+ ping -w 2 -c 2 192.168.110.2
+ '[' 0 -eq 0 ']'
+ echo 10208i
+ break
变量
变量是用来存储数据或字符串的占位符。
变量的作用:用来存放系统和用户需要使用的特定参数(值)。使用变量可以避免在脚本中重复输入相同的值或字符串,提高了代码的复用性和效率。
变量名:使用固定的名称,由系统预设或用户定义。
设置变量名的注意事项:
1、不要使用系统的命令作为变量名
2、不要使用中文
3、不能特殊符号开头 可以用_来开头
4、在指定变量名的时候有一个默认的规则:计算机:computer 学生:student a= b=
5、要有注释,还要注意前后一致
6、只能包含字母、数字、下划线
7、严格区分大小写
变量值:能够根据用户设置和系统环境的变化而变化。
整数变量的运算
格式:expr 变量1 运算符 变量2 [运算符 变量3]
常用运算符:+ 加法、- 减法、\* 乘法、/ 除法、% 取余
举例:
i=$(expr 12 \* 5)
root@sl02 ~]# i=$(expr 12 \* 5)
[root@sl02 ~]# echo $i
60
i=$((12*5))
[root@sl02 ~]# i=$((12*5))
[root@sl02 ~]# echo $i
60
let i=12*5
[root@sl02 ~]# let i=12*5
[root@sl02 ~]# echo $i
60
bc是一个简单易用的计算器程序,可以用于执行基本的数学运算,如加、减、乘、除和取余等操作。
在Shell编程中,可以使用bc命令将数学表达式的计算结果输出到标准输出或保存到文件中,以满足不同的需求。
[root@sl02 ~]# echo 4*7|bc
28
非整数运算也运用到bc。
[root@sl02 ~]# i=$(echo "4.2+5.5"|bc)
[root@sl02 ~]# echo $i
9.7
环境变量
环境变量由系统提前创建,用来设置用户的工作环境,使用 env 命令可以查看到当前工作环境下的环境变量。
变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,变量PATH表示可执行程序的默认搜索路径。
[root@sl02 ~]# echo $USER
root
[root@sl02 ~]# echo $HOME
/root
[root@sl02 ~]# echo $LANG
zh_CN.UTF-8
[root@sl02 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@sl02 ~]# echo $PWD
/root
环境变量的类型
系统级环境变量: 这些变量对整个操作系统及其所有用户都是可见的。例如,PATH变量存储了操作系统查找可执行文件的路径列表。
用户级环境变量: 这些变量只对当前用户可见。每个用户可以定义自己的环境变量,用于满足个人需求。例如,HOME变量指定了当前用户的主目录路径。
预定义环境变量: 操作系统或应用程序预先定义了一些常用的环境变量,用于提供特定的信息和功能。例如,USER变量保存当前用户名,LANG变量指定了当前系统的默认语言。
自定义环境变量: 用户和应用程序可以定义自己的环境变量,用于存储特定的信息或配置。
位置变量,有名命令行参数,是在运行脚本或程序时传递给它们的值。
当执行命令行操作时,第一个字段表示命令名或脚本程序名,为$0;其余的字符串参数按照从左到右的顺序依次赋值给位置变量。($1,$2,$3...)
[root@sl02 ~]# ./test1.sh 1 2 3
1 2 3
3
1 2 3
1 2 3
[root@sl02 ~]# $?
bash: 0: 未找到命令...
[root@sl02 ~]# cat test1.sh
#!/bin/bash
echo "$1 $2 $3 "
echo "$#"
echo "$*"
echo "$@"
\*、@都表示命令或脚本要处理的参数。但$*把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 3 "。而@把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3"。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码。返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
双引号 (" ")与单引号 (' ')
双引号 (" "):Shell脚本或命令行中,双引号用于定义字符串。当字符串被双引号包围时,其中的大多数特殊字符(如$, `, \, 和")会被特殊处理,而其他字符则按其原义处理。
单引号 (' '):与双引号类似,单引号也用于定义字符串。但是,被单引号包围的字符串中的所有字符都会按其原义处理,不会发生任何扩展或替换。
[root@sl02 ~]# ./test1.sh 1 2 3
1 2 3
$1 $2 $3
[root@sl02 ~]# cat test1.sh
#!/bin/bash
echo "$1 $2 $3 "
echo '$1 $2 $3'