新乡网站建设价格,中国反钓鱼网站联盟,天津建设厅官方网站,html代码分享Shell脚本语言 Shell关键字Shell变量命名规则使用变量赋值变量自定义变量命令行交互read定义变量类型declare预定义变量环境变量 Shell字符串Shell中的集合类型数组#xff08;array#xff09;数组定义和赋值数组元素访问获取数组长度 map Shell运算算数运算符关系运算符布尔… Shell脚本语言 Shell关键字Shell变量命名规则使用变量赋值变量自定义变量命令行交互read定义变量类型declare预定义变量环境变量 Shell字符串Shell中的集合类型数组array数组定义和赋值数组元素访问获取数组长度 map Shell运算算数运算符关系运算符布尔运算符逻辑运算符字符串运算符文件测试运算符 Shell语句if语句if语句语法格式if else语法格式if else-if else语法格式 for循环while循环until循环case...esac跳出循环breakcontinue Shell函数定义函数调用函数获取返回值定义局部变量 Shell调试 第一行的#!/bin/bash标识该Shell脚本是由哪个shell解释
#!/bin/bashShell关键字
echo打印内容到屏幕上exec执行另一个Shell脚本read读标准输入expr对整数型变量进行算术运算test用于测试变量是否相等、是否为空、文件类型等
Shell_demo01.sh
#!/bin/bash
echoHello Shellread ABC
echo ABC is $ABCexpr $ABC - 4test HelloHello Shell
test -d /home/kanglei/codeexec /home/kanglei/code/shell_demo02.shexitShell_demo02.sh
#!/bin/bash
echo Im Kavien初次执行会报错没有权限
shell_demo01.sh: line 12: /home/xiaoming/code/shell_demo02.sh: Permission denied shell_demo01.sh: line 12: exec: /home/xiaoming/code/shell_demo02.sh: cannot execute: Permission denied
然后我们将两个文件的权限都赋值为777
chmod 777 shell_demo01.sh
chmod 777 shell_demo02.sh 再次执行即可执行成功结果如下
99
ABC is 99
95
Im KavienShell变量
命名规则
定义变量时变量名不加美元符号$变量名和等号之间不要出现空格但是可以使用下划线 - ‘_’一般变量名用大写命名只能是英文字母、数字和下划线首个字符不能以数字开头不能使用标点符号和关键字
使用变量
使用一个已经被定义过的变量。只要在变量名前面加美元符号并将变量加上花括号即可。
my_namexiaoming
echo ${my_name}赋值变量
赋值处必须是一个整体不能有空格想要有空格请使用单引号或者双引号将赋值处进行包围
自定义变量
只读变量 使用readonly将变量定义为只读变量只读变量值不可改变 删除变量 使用unset可以删除变量变量被删除后不能再次使用unset不能删除只读变量 全局变量 使用export将变量设置为全局变量
#!/bin/bash
echo Im Kavien# 定义普通变量
NAMExiaoming
# 定义只读变量
readonly COUNTRYSHANGHAI
# 定义全局变量
export HOMEshanghai pudong# 打印变量的值
echo $NAME
echo $COUNTRY
echo $HOME# 删除变量
unset NAME
unset COUNTRY
unset HOMEecho $NAME
echo $COUNTRY
echo $HOMEexit执行结果如下
Im Kavien
xiaoming
SHANGHAI
shanghai pudong
shell_demo02.sh: line 18: unset: COUNTRY: cannot unset: readonly variableSHANGHAI
命令行交互read
有时候我们希望在脚本运行时能根据用户的输入决定脚本后续执行逻辑比如在安装插件的时候经常会让用户选择输入[N/Y]的时候。
read -p Please input [N/Y]: yn
if [$yn N -o $yn n ]; thenecho NO
elif [$yn Y -o $yn y ]; then echo YES
firead命令的使用形式为
read [-pt] variable参数p:后面可以接提示符参数t:后面可以接秒数
eg:
read -p please input your name -t 5 name
# 表示将输入内容赋值给变量name用户有5秒钟的输入时间。定义变量类型declare
declare命令的使用形式如下
declare [-aixr] variable参数a:将variable定义为数组参数i:将variable定义为整形(integer)参数x:将variable设置成环境变量类似于export的作用参数r:variable为readonly类型值不能被更改默认情况下变量的赋值内容都是字符类型的。例如sum100300500我们希望echo $sum输出的是一个求和表达式100300500。如果想要输出求和后的值可以使用declare命令declare -i sum100300500结果输出echo $sum的是900。
预定义变量
预定义变量常用来获取命令行的输入
$0脚本文件名$1-9第1-9个命令行参数名$#命令行参数个数$所有命令行参数$*所有命令行参数$前一个命令的退出状态$$执行的进程ID
环境变量
环境变量默认就存在常用的有以下几种
HOME用户主目录PATH系统环境变量PATHTERM当前终端UID当前用户IDPWD当前工作目录绝对路径
Shell字符串 字符串是用单引号或者双引号或者可以不使用引号的整体。 单引号字符串的限制 单引号字符串中的变量值是无效的单引号中不能使用转义字符 双引号字符串的优点 双引号字符串中可以变量双引号中可以出现转义字符 拼接字符串 result1hello,${COUNTRY}!
result2hello,${COUNTRY}!result3hello,${COUNTRY}!
result4hello,${COUNTRY}!
echo $result1 $result2
echo $result3 $result4运行结果为 hello,SHANGHAI! hello,SHANGHAI!
hello,SHANGHAI! hello,${COUNTRY}!获取字符串的长度 echo ${#COUNTRY}等价于${#COUNTRY[0]}提取子字符串 # 从字符串中第二个字符开始截取3个字符
echo ${COUNTRY:1:3}
# 从倒数第二位开始截取三个字符最后一个字符下标为-1
echo ${COUNTRY:(-2):3}
# 从第二位开始截取到最末尾第一个字符下标为0
echo ${COUNTRY:2}【注】第一个字符的索引值为0。 查找子字符串哪个字母先出现就计算哪个 stringrunoob is a great site
echo expr index $string io # 输出4【注】以上脚本中的是反引号而不是单引号’。 删除字符串 #从前往后截取%从后往前截取 如果使用两个#或者两个%则表示将符合的最长数据删除 strhttps://www.baidu.com/123/abc
# 删除前面的https://
echo ${str#https://} # www.baidu.com/123/abc
# 删除后面的/abc
echo ${str%/abc} # https://www.baidu.com/123替换字符串 # 将https替换成HTTP
echo ${str/https/HTTP}使用一个斜杠/表示只替换第一个遇到的字符使用两个斜杠//则表示替换全部负荷的字符使用#匹配以指定字符开头的字符串#删除字符串的前缀使用%匹配以指定字符结尾的字符串%删除字符串的后缀 echo ${str/b/B} # https://www.Baidu.com/123/abc
echo ${str//b/B} # https://www.Baidu.com/123/aBc
echo ${str/#abc/ABC} # https://www.baidu.com/123/abc
echo ${str/%abc/ABC} # https://www.baidu.com/123/ABC
echo ${str/#ht/HT} # HTtps://www.baidu.com/123/abc
echo ${str/%ht/HT} # https://www.baidu.com/123/abc字符串默认值 # 如果变量name没有赋过值则给一个默认值default否则使用指定的值
echo $name # 输出为空
echo ${name-default} # defalutnameabc
echo ${name-default} # abc
# 如果将变量设置为则会认为赋过值
name
echo ${name-default} # 输出为空
# 如果变量内容为或者变量未初始化则给默认值可以在-前面加个冒号使用:-
name
echo ${name-default} # 输出为空
echo ${name:-default} # default字符串split成数组 # 以空格为分隔符分隔字符串成数组
sa b c d e
a($s)
echo ${a[*]} # a b c d e
echo ${a[3]} # d
# 需要指定特定字符进行分隔且原字符中又没有空格时将特定字符替换成空格然后进行分隔
sa,b,c,d,e
a(${s//,/ }) # 两个斜线 // 表示全局替换的意思。逗号,是要被替换的模式空格是替换后的文字。
# 如果字符串中本身带有空格并且希望分隔符不为空格sa b,c d e,f,g,h,i,jold_ifs$IFSecho s #secho $s # a b,c d e,f,g,h,i,jecho $old_ifs # IFS,echo $s # a b c d e f g h i ja($s)echo $a # a becho ${a[]}# a b c d e f g h i jecho ${a[2]} # fecho ${a[1]} # c d eecho ${a[3]} # gecho ${a[4]} # hecho ${#a[0]} # 3echo ${#s} # 19echo ${#a[*]} # 7 字符串的包含 # 有时需要判断字符串str1中是否包含字符串str2使用~操作符
str1hello
str2ell
if [[$str1 ~ $str2 ]];thenecho $str1 contain $str2
fi符号 这个符号在数字键1的左侧与单引号很类似但其功能与单引号都有不同该符号中的命令会被执行 ddate
echo $d如果不想用这个符号可以用$() 替换 e$(date)
echo $eShell中的集合类型
数组array
数组定义和赋值
数组中的元素用括号包围各元素之间用空格隔开。
array_name(v0 v1 v2 v3 v4)
# 重新设置指定元素的内容
array4_name[2]v22
echo ${array_name[2]} # v22数组元素访问
echo ${array_name[*]} # v0 v1 v2 v3 v4
echo ${array_name[]} # v0 v1 v2 v3 v4数组元素下标从0开始想要访问指定位置的元素使用[]指定下标值
echo ${array_name[0]} # v0
echo ${array_name[3]} # v3获取数组长度
# 获取整个数组的长度
echo ${#array_name[]} # 5
echo ${#array_name[*]} # 5
# 获取数组中单个元素的长度
echo ${#array_name[2]} # 2map
map类型中存储的是键值对map变量使用如下
# 定义map变量
declare -A map([a]1 [b]2)
# 输出所有的key
echo ${!map[]}
# 输出所有的value
echo ${map[]}
# 输出指定key对应的value
echo ${map[a]}
echo ${map[c]}
# 添加元素
map[c]3
echo ${map[c]}
# map中键值对的个数
echo ${#map[]}Shell运算
【注意】
表达式和运算符之间要有空格例如22是不正确的必须写成2 2。完整的表达式要被两个反引号包含。
算数运算符
下面列出了常用的算数运算符假定变量a为10b为20
运算符说明举例加法expr $a $b 结果为 30-减法expr $a - $b 结果为 -10*乘法expr $a \* $b 结果为 200/除法expr $b / $a 结果为 2%取余expr $b % $a 结果为 0赋值a$b 把变量 b 的值赋给 a相等。用于比较两个数字相同则返回true。[ $a $b ] 返回 false!不相等。用于比较两个数字相同则返回true。[ $a ! $b ] 返回 true
【注意】
条件表达式要放在方括号之间并且要有空格例如[$a$b]是错误的必须写成[ $a $b ]。乘号*前边必须加反斜杠\才能实现乘法运算
关系运算符
关系运算符只支持数组不支持字符串除非字符串的值是数字。
运算符说明举例-eq检测两个数是否相等相等返回 true。[ $a -eq $b ] 返回 false。-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。
布尔运算符
运算符说明举例!非运算表达式为 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。
逻辑运算符
运算符说明举例逻辑的 AND[[ $a -lt 100 $b -gt 100 ]] 返回 false||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符串运算符
假定变量a为abc变量b为efg
运算符说明举例检测两个字符串是否相等相等返回 true。[ $a $b ] 返回 false。!检测两个字符串是否不相等不相等返回 true。[ $a ! $b ] 返回 true。-z检测字符串长度是否为0为0返回 true。[ -z $a ] 返回 false。-n检测字符串长度是否不为 0不为 0 返回 true。[ -n “$a” ] 返回 true。$检测字符串是否不为空不为空返回 true。[ $a ] 返回 true。
文件测试运算符
文件测试运算用于检测Unix文件的各种属性
操作符说明举例-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。-w file检测文件是否可写如果是则返回 true。[ -w $file ] 返回 true。-x file检测文件是否可执行如果是则返回 true。[ -x $file ] 返回 true。-s file检测文件是否为空文件大小是否大于0不为空返回 true。[ -s $file ] 返回 true。-e file检测文件包括目录是否存在如果是则返回 true。[ -e $file ] 返回 true。
其他检查符
-S判断某文件是否socket-L检测文件是否存在并且是一个符号链接
Shell语句
shift 命令可以用于将命令行参数向左移动一位也就是忽略第一个参数让 $2 作为新的 $1以此类推。
#!/bin/bash
echo 原始参数: $*
shift
echo shift后参数: $*
shift 2
echo shift 2后参数: $*1995运行命令bash test.sh wo shi xiao ming ni meng hao运行结果如下
原始参数: wo shi xiao ming ni meng hao
shift后参数: shi xiao ming ni meng hao
shift 2后参数: ming ni meng hao1995if语句
if语句语法格式
if condition
then command1command2...commandN
fi可以将以上命令写为一行适用于终端命令行提示符
if [ $(ps -ef | grep -c ssh) -gt 1 ]; then echo true; fi代码解释 这段代码是一个简单的条件判断语句用于检查系统中正在运行的 SSH 进程数量是否大于 1。 代码中使用了 $() 来执行命令替换。$(ps -ef | grep -c ssh) 执行了一个命令用于查询运行中的进程列表然后使用 grep 过滤出包含 “ssh” 字符串的行并使用 -c 参数计算匹配行的数量。 接着[ ... ] 是一个条件判断语句的开头-gt 表示大于的比较运算符1 是要比较的值。 如果运行中的 SSH 进程数量大于 1则输出 “true”。
if else语法格式
if condition
then command1command2
else command3
fiif else-if else语法格式
if condition
then command1
elif condition2
thencommand2
elsecommand3
fiif else的[...]判断语句大于使用-gt小于使用-lt。
if [ $a -gt $b ]; then...
fi如果使用((...))作为判断语句大于和小于可以直接使用和。
for循环
for循环语法格式
for var in item1 item2 ... itemN
do command1command2
done一行格式
for var in item1 item2 ... itemN; do command1; command2... done;当变量值在列表中for循环即执行一次所有命令使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。
in列表是可选的如果不用它for循环使用命令行的位置参数。
# 顺序输出当前列表中的数字
for loop in 1 2 3 4 5
doecho The value is:$loop
done
# 顺序输出字符串中的字符
for str in This is a string
doecho $str
donewhile循环
while循环用于不断执行一系列命令也用于从输出文件中读取数据。
while condition
docommand
done# 举例说明:如果int小于等于5则输出int的值并使int1
int1
while(( $int5))
doecho $intlet int
done
# 上述案例中使用到了let命令用于执行一个或多个表达式变量计算中不需要加上$来表示变量无限循环
while
docommand
done
# 或者
while true
docommanddone
# 或者
for (( ; ; ))until循环
until循环执行一系列命令直至条件为true时停止until循环与while循环在处理方式上刚好相反
# until语法格式
until condition
do command
donecondition一般为条件表达式如果返回值为false则继续执行循环体内的语句否则跳出循环。
# 使用until输出0~9的数字
a0
until [ ! $a -lt 10 ]
doecho $aaexpr $a 1
donecase…esac
case…esac为多选择语句与其他语言中的swith…case语句类似是一种多分支选择结构每个case分支用右圆括号开始用两个分号;;表示break即执行结束跳出整个case…esac语句esac作为结束标记。
可以用case语句匹配一个值与一个模式如果匹配成功执行想匹配的命令。
case 值 in
模式1)command1command2;;
模式2)command1command2;;
esac取值后必须为单词in取值可以为变量或常数每个模式必须以右括号结束如果无一匹配模式使用星号*捕获该值再执行后面的命令。
# 脚本提示输入寻找相匹配的项
echo 输入 1 到 2 之间的数字:
echo 你输入的数字为:
read aNum
case $aNum in1) echo 你选择了 1;;2) echo 你选择了 2;;*) echo 你没有输入 1 到 2 之间的数字;;
esac
# 脚本匹配字符串
siteabc
case $site inabc) echo ABC ;;def) echo DEF ;;ghi) echo GHI ;;
esac跳出循环
break
break命令允许跳出所有循环终止执行后面的所有循环
# 以下脚本会进入死循环直到接收到输入数字大于5的情况会跳出这个循环
while :
doecho -n 输入 1 到 5 之间的数字:read aNumcase $aNum in1|2|3|4|5) echo 你输入的数字为 $aNum!;;*) echo 你输入的数字不是 1 到 5 之间的! 游戏结束break;;esac
donecontinue
continue命令不会跳出所有循环仅仅跳出当前循环
# 当接收到数字大于5时循环不会结束语句echo 游戏结束永远不会被执行
while :
doecho -n 输入 1 到 5 之间的数字: read aNumcase $aNum in1|2|3|4|5) echo 你输入的数字为 $aNum!;;*) echo 你输入的数字不是 1 到 5 之间的!continueecho 游戏结束;;esac
doneShell函数
定义函数
# 语法格式
function 函数名 () {command
}function 函数名 {command
}函数名 () {command
}# 案例说明
function hello_fun(){echo hello function() funecho $1 $2return 1
}function hello_function{echo hello function funecho $1 $2return 1
}hello()
{echo hello fun
}调用函数
# 直接使用函数名调用hello函数
hello
# 使用[函数名 函数参数]来传递参数
hello_function 1 2
# 使用[FUN函数名 函数参数]来间接调用
Funhello_fun 1 2
echo $FUN获取返回值
$?可用于获取前一个函数的返回值
hello_fun 1 2
echo $? # 返回1定义局部变量
# 使用local来在函数中定义本地变量
fun()
{local x1echo $x
}Shell调试
sh -n script_name.sh检查是否有语法错误没有任何输出则表示无语法错误。
sh -x script_name.sh执行并调试Shell脚本
# 命令
sh -x test.sh wo shi xiao ming ni meng hao
# 运行结果echo 原始参数: wo shi xiao ming ni meng hao
原始参数: wo shi xiao ming ni meng haoshiftecho shift后参数: shi xiao ming ni meng hao
shift后参数: shi xiao ming ni meng haoshift 2echo shift 2后参数: ming ni meng hao1995
shift 2后参数: ming ni meng hao1995前缀为表示Shell的输出不带任何符号的表示我们程序的输出。