shell脚本
shell脚本满足的要素:
1.要有解释器文件的第一行
2.要有注释脚本的功能、作者、邮箱、编写的时间
3.程序语句条件测试、循环语句、判断、函数、数组、变量
shel的脚本文件
文件一般以.sh结尾 .sh没有意义是用来给人看的
文件的一行是解释器#/bin/bash表示使用bash shell来执行下面的代码
注释
单行注释
<< BLOCK多行注释的内容
BLOCK
shell的执行:
1.使用bash shell执行文件可以没有执行权限
在子shell中执行
2.使用相对路径
执行文件必须要有执行权限
在子shelle中执行
3.使用绝对路径执行文件必须要有执行权限
在子shelle中执行
4.使用source
执行文件可以没有执行权限
在当前shell中执行是为了获取得到文件
里面的环境变量,这个变量记录了云平台的登录系统
Shell脚本编写规范
使用.vimrc文件,能够快速的生成开头的注释信息
[root@ scripts]# cat ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"##################################################")
call setline(3, "#File Name: ".expand("%"))
call setline(4, "#Version: V1.0")
call setline(5, "#Author: sunrui")
call setline(6, "#Email: 312730265@qq.com")
call setline(7, "#Created Time : ".strftime("%F %T"))
call setline(8, "#Description:")
call setline(9,"#######################################################")
call setline(10, "")
endif
endfunc
位置化参数(就是一类特殊的变量):
$1$2$3
$1表示脚本后的第一个参数
$2表示脚本后的第二个参数
$n表示脚本后的第N个参数
预定义变量
是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
$0 :脚本名
$* :所有的参数,双引号引起来时参数视为单个字符串
$@:所有的参数,双引号引起来时,每个参数作为个体
$# :参数的个数
$$ :当前进程的PID
$? :上一个命令的返回值0表示成功
read
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名
read命令行中也可以不指定变量 ,如果不指定变量,那么read命令会将接收到的数据放置在环境变
量REPLY中。
exit
程序执行后会携带一个退出码:
(1) 0代表成功,1-255代表失败
(2) Shell程序的退出码储存在系统变量$?中
(3) exit num可以中断程序并设置退出码为num
根据命令返回值可以判断命令是否执行成功值为0时表示命令执行成功,非0时表示命令执行失败
条件执行运算符:
&& 逻辑与 两者同时返回为真则为真
|| 逻辑或 一个为真就为真
用来连接命令
command1 && command2
表示command1执行成功才会执行command2
command1返回值为0则执行command.2
command1返回值为非0则不执行command2
command1 || command2
如果command1返回值为0则command2不执行
如果command1返回值为非0则command2执行
#举例
grep -q no_such_user/etc/passwd || echo'No such user'
No such user
ping -c1 -W2 station1 &> /dev/null \
> && echo "station1 is up" \
> || { echo 'station1 is unreachable';exit1;}
station1 is up
复合指令
原则上都是运行一串命令
() 在子shl中执行不需要分号结尾 命令和括号之间不需要有空格
{} 在当前shelle中执行必须使用分号结尾 第一个命令和左边的括号必须要有空格
在括号内的重定向影响括号内的命令,括号外的重定向影响所有的命令
#举例
[root@localhost opt]# (pwd;cd /tmp;pwd)
/opt
/tmp
[root@localhost opt]# { pwd;cd /tmp;pwd;}
/opt
/tmp
#()子shell中执行,执行完毕,当前路径不变
条件测试
在shell程序中,用户可以使用测试语句来测试指定的条件表达式的真或者假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。
格式1: test 条件表达式 进行单个条件测试
格式2: [ 条件表达式 ] 和test一致
格式3: [[ 条件表达式 ]] 条件执行运算符 && ||
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回true | [ -b $file ] 返回false |
-c file | 检测文件是否是字符设备文件,如果是,则返回true | [ -c $file ] 返回false |
-d file | 检测文件是否是目录,如果是,则返回true | [ -d $file ] 返回false |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true | [ -f $file ] 返回true |
-g file | 检测文件是否设置了SGID位,如果是,则返回true | [ -g $file ] 返回false |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true | [ k $file ] 返回false |
-p file | 检测文件是否是具名管道,如果是,则返回true | [ -p $file ] 返回false |
-u file | 检测文件是否设置了SUID位,如果是,则返回true | [ -u $file ] 返回false |
-r file | 检测文件是否可读,如果是,则返回true | [ -r $file ] 返回true |
数值运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回true | [ $a -eq $b ] 返回true |
-ne | 检测两个数是否相等,不相等返回true | [ $a -ne $b ] 返回true |
-gt | 检测左边的数是否大于右边的,如果是,则返回true | [ $a -gt $b ] 返回false |
-lt | 检测左边的数是否小于右边的,如果是,则返回true | [ $a -lt $b ] 返回true |
-ge | 检测左边的数是否大等于右边的,如果是,则返回true | [ $a -ge $b ] 返回false |
-le | 检测左边的数是否小于等于右边的,如果是,则返回true | [ $a -le $b ] 返回true |
布尔运算符
!非运算对条件表达式取反
-o 或运算某一个条件表达式成立则为真 类似 || 逻辑或
-a 与运算条件表达式同时成立则为真 类似 && 逻辑与
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为true则返回为false,否则返回为true | [ !false ] 返回true |
-o | 或运算,有一个表达式为true则返回true | [ $a -lt 20 -o $b -gt 100 ] 返回true |
-a | 与运算,两个表达式都为true才返回true | [ $a -lt 20 -a $b -gt 100 ] 返回false |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回true | [ $a = $b ] 返回false |
!= | 检测两个字符串是否相等,不相等返回true | [ $a != $b ] 返回true |
条件判断if语句
单分支结构
第一种语法:
if <条件表达式>
then
执行语句
fi
第二种语法:
if <条件表达式>;then
执行语句
fi
双分支结构
if <条件表达式>
then
条件成立的执行语句
else
条件不成立的执行语句
fi
多分支结构
if <条件表达式1>
then
执行语句1
elif <条件表达式2>
then
执行语句2
elif <条件表达式3>
then
执行语句3
else
执行最后的执行语句(前面所有条件都不成立)
fi
#举例
#根据用户输入成绩,判断优良中差。
#85-100 优秀--A 70-84 良好--B 60-69 合格--C 60分以下不合格--D
read -p "Please enter your score (0-100): " grade
if [ $grade -ge 85 ]; then
echo "$grade, A"
elif [ $grade -ge 70 ]; then
echo "$grade, B"
elif [ $grade -ge 60 ]; then
echo "$grade, C"
else
echo "$grade, D"
fi
本文作者:kongshuo
本文链接:https://www.cnblogs.com/kongshuo/p/16271538.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步