- 什么是Linux的Shell脚本和怎么执行脚本?
//https://blog.youkuaiyun.com/sunxiwang/article/list/2?t=1
shell中的判断与循环
- 什么是Shell?
shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。
二、什么是脚本?
脚本就是由Shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
三、Linux中有哪些脚本解释器?
有dash和bash两种,但dash没有bash功能全面,所以通常使用bash。可以通过命令来查看系统中的脚本解释器ls – l/bin/*sh
- 怎么执行脚本文件?
先创建一个脚本文件 script.sh , 后缀名是 .sh
#!/bin/bash
echo "this is the first shell script"
注意:执行之前首先要为脚本文件添加可执行权限,不然就得用root权限才能执行!
添加可执行权限: chmod +x script.sh 回车
<1>第一种执行方式
dash/bash script.sh 回车
<2>第二种执行方式
./script.sh 回车
这两中执行方式有什么区别呢?
区别:第一种方式,使用/bin/sh所指向的shell解释器来执行脚本文件
第二种方式,它默认使用/bin/sh所指向的shell解释器来执行脚本文件,前提是脚本文件中未指定解释器。但如果在脚本文件中指定了使用哪种脚本解释器,那么它就不管/bin/sh指向哪个脚本解释器,而是使用脚本文件中所制定的那个脚本解释器。
在脚本文件中指定脚本解释器: #!/bin/bash
<3>第三种执行方式
指定脚本文件的绝对路径,即可执行
举例: /home/liutao/LinuxStudy/shellStudy/script.sh 回车
这种执行方式选择使用的脚本解释器和第二种相同。
执行脚本文件后输出截图:
- Shell脚本的基本语法(一) if判断、for循环、while循环和until循环
Shell中的注释标志是井号 "#",除了脚本文件第一行的#不是注释之外,其他地方出现#,则说明#开始,到本行的末尾都是注释
指定脚本解释器
一般每个Shell脚本文件的第一行都是指定脚本解释器
#!/bin/bash : 指定本脚本文件使用bash脚本解释器解释执行
if 判断语法
<1>、判断大小
首先Shell中判断两个数字大小的方式:
-gt(大于) -lt(小于) -eq(等于) -le(小于等于) -ge(大于等于)
判断两个字符串的方式:
>(大于) <(小于) ==(等于) >=(大于等于) <=(小于等于)
<2>、通过实例来描述if语法
1.if语句
- shell中的if语句结构如下,它通过判断command1的返回值,若0(即命令成功执行)则执行command2、command3;若1则不执行
if commandA
then
command1
command2
fi
#另一种风格的写法
if commandA ; then
command1
command2
fi
1
- 当然shell中也有else,还有elseif,用法分别如下:
if commandA ; then
command1
else
command2
fi
if commandA ; then
command1
elif commanB ; then
command2
elif commandC ; then
command3
fi
- 当需要多次判断时,也可用switch case来替代if else
case $USR in
root)
echo root
echo oh!;;
jack)
echo jack;;
peter | ben) #满足peter或ben
echo hah! hah!;;
*) #星号代表默认情况
echo error;;
esac
- test命令是if语句的好伴侣,常用来判断条件是否满足,满足返回0,不满足返回1;test可以用来比较:数值、字符串、文件/路径。常见用法为:
if test condition ; then #(“ ; ”作为分隔符, then语句换行可将分号“ ; ”省略)
commands
fi
#bash支持的另一种格式,本质也是调用了test,千万要注意在condition和方括号之间加空格
if [ condition ] ; then
commands
fi
- 当test用于数值比较时,基本格式为var1 参数 var2,如下,具体参数有很多,可以上网查
if [ $var1 -eq $var2 ] #判断var1和var2变量值是否相等
if [ $var1 -gt 2 ] #判断var1的变量值是否大于2
- 1
- 当test用于字符串比较时,基本格式也为var1 符号 var2,此外还可以使用[[ ]]来使用正则匹配
if [ $string1 = $string2 ] #判断变量string1和string2值是否相等
if [ $USR = !root ] #判断变量USR值是否不等于root
if [[ $USR == r* ]] #判断变量USR值是否以字母r开头
- 当test用于判断文件和目录的状态时,基本格式为参数 filepath如下,具体参数有很多,可以上网查
if [ -d $MYPATH ] #判断位于$MYPATH的文件是否存在,并且是个目录
if [ -e $MYPATH ] #判断位于$MYPATH的文件是否存在
if [ -r $MYPATH ] #判断位于$MYPATH的文件是否可读
if [ -x $MYPATH ] #判断位于$MYPATH的文件是否可执行
- test 还可以判断一个变量是否有值
if [ -z "$USR" ] #判断变量USR长度是否为零
if [ -n "$USR" ] #判断变量USR长度是否非零
- 对于复合判断语句,shell中使用&&和||来表示,尤其需要注意的是,shell中以命令返回0为真,1位假,故&&和||操作以逻辑真假为准,不再以数值上的0和1为准
if [ condition1 ] && [ condition2 ]
if [ condition1 ] || [ condition2 ]
- 此外&&还能用来作为简易版本的if语句,左边的命令返回真(即返回0),右边的命令才被执行
-
[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1
3、for循环语法
<1>、第一种循环方式
<2>、第二种循环方式
<3>、第三种循环方式
在此详细说几种算奇数和的方法:
for i in {1..100..2}
do
let "sum+=i"
done
//
for i in $(seq 1 2 100)
do
let "sum+=i"
done
<4>第四种循环方式
类似C语言的风格 ::这种用法与C语言一样,就不在多说
for((expression1;expression2;expression3))
do
循环体
done
4、while循环语法
5、until循环语法
until与其他循环不同,它是判断表达是为假时进行循环。而其他循环是判断条件为真时进行循环,条件为假则跳出循环。(此循环并不常用)
- Shell脚本的基本语法(二) 预定义特殊字符、case语句和函数调用
-
一、Shell中有许多预定义的特殊字符:
-
$n :n是一个数字(大于10则用大括号括起来,${12}),代表程序的第n个参数
(注释:$0代表当前使用的shell、在命令行环境下表示当前shell的名称,在脚本中表示当前执行的脚本名称。
$1...$9:在脚本中用来表示位置参数,即脚本执行时所带的第几个参数的值。 )
$# :总共有多少个参数
$* :指所有的参数
$@ :指所有的参数
$? : 上次命令执行的返回值
注意:我们发现$*和$@的意思是一样的,其实它们两个有一个很大的区别:
$* 将所有参数放在一块内存中,以空格分隔
$@ 将每个参数分别放在一块内存中,相当于字符串数组
二、case语句,shell中的开关语句
shell中的开关语句有许多地方和C语言是类似的我们可以通过对比两个就可发现其相似之处。
不同之处:
C语言中每个开关结束时,必须以break跳出。如果不跳的话继续向下执行。
而在shell中每个开关是以双分号;;来跳出的。如果不跳则出现语法错误。
三、shell中的函数调用
shell中的函数可以有参数,也可以有返回值。
但是它没有形参列表,没有返回值类型,而且取返回值的方式也与众不同。
4、Shell脚本实例(一) 监控一个程序的运行情况
-
一、问题描述:
监控指定程序是否运行,如果程序没有运行,那么启动程序。
二、解决思路:
<1>、我们判断一个程序是否运行,可以通过查看该程序的进程信息来判断。
例: 判断程序 01FirstScript.sh 是否在运行;
命令:ps -ef | grep 01FirstScript.sh | grep -v grep
结果分析: 如果命令执行之后有输出,即输出进程信息。则说明程序正在运行,如果执行之后没有输出,则说明程序没有运行
<2>、如何监控指定的程序?
我们可以将指定程序的名字作为监控程序的参数传递进去,在内部实现时,通过死循环来不断监控
<3>、如果程序未运行,如何启动程序?
在判断程序为运行时,如果指定程序名是监控程序的第一个参数。可以通过下面命令启动指定程序
sh $1
三、脚本代码实现:
#!/bin/bash
#进程监控脚本
#功能需求: 监控程序是否运行,如果程序没有运行,那么启动程序。
while [ true ]
do
pro=$(ps -ef | grep "$1" | grep -v grep | grep -v "$0")
#过滤出目标进程信息,如果pro为空串说明目标进程未运行
#反向过滤掉grep进程 和 本进程信息, 因为这两个进程信息中包含目标进程的名字
if [ -z "$pro" ]
then
echo "程序未启动,重新启动程序"
sh $1 #重新启动指定程序
else
echo "程序正在运行..."
fi
sleep 0.5
done
四、运行结果截图:
五、程序运行过程说明:
<1>、一开始指定程序并未运行
<2>、然后监控进程检测指定程序未运行,随即启动指定程序
<3>、指定程序开始运行
<4>、在中途使用kill命令终止指定程序进程
<5>、监控进程再次检测到指定程序未运行,随即启动指定程序
<6>、指定程序开始运行
程序调试心得:
bash my_1_shell.sh my_first_shell.sh
bash ./my_1_shell.sh ./my_first_shell.sh #(./指定当前路径)
注释:启动“my_1_shell.sh”判别程序“my_first_shell.sh”是否启动,如果没有启动就启动“my_first_shell.sh”程序;
bash ./my_first_shell.sh | bash ./my_1_shell.sh
注释:先启动程序“my_first_shell.sh”,利用“my_1_shell.sh”判定“my_first_shell.sh”程序是否启动;