# Shell解释
目录
所谓的Shell编程, 就是在1个文件中写Linux代码, 然后通过Shell解析器来解析的过程. # 流程 在后缀名为.sh的文件中写Linux命令 => 执行该Shell脚本 => Shell解析器会解析该脚本 => 执行并查看结果
1.1 Shell--定义变量
# 变量解释 在程序的执行过程中, 其值可以在一定范围内发生改变的量, 就叫: 变量. # 示例代码. [root@node1 ~]# name=zhangsan # 如果变量值没有空格, 可以直接写 [root@node1 ~]# echo name name [root@node1 ~]# hobby=eat shuij # 如果字符串值有空格, 必须用引号包裹. -bash: shuij: 未找到命令 [root@node1 ~]# hobby="BasketBall DeskBall PPQ" [root@node1 ~]# echo $hobby BasketBall DeskBall PPQ # 演示删除变量. [root@node1 ~]# name=hangge [root@node1 ~]# echo $name hangge [root@node1 ~]# unset name # 删除变量, 即使不删除, 重启服务器, 该变量也会被自动删除. [root@node1 ~]# echo $name
1.2 Shell--字符串操作
# 结论: 以后定义字符串, 尽量使用双引号. [root@node1 ~]# name=hangge [root@node1 ~]# echo my name is '$name' my name is $name [root@node1 ~]# echo my name is 'name' my name is name [root@node1 ~]# [root@node1 ~]# echo my name is "$name" # 双引号包裹的$有特殊意义, 单引号包裹则原样输出.也可以不使用 my name is hangge [root@node1 ~]# [root@node1 ~]# echo 'my name is $name' my name is $name
1.3 Shell--反引号的作用
要执行Linux命令, 则: 用反引号包裹或者用$()包裹 [root@node1 ~]# echo date date [root@node1 ~]# echo `date` # 如果要执行Linux命令, 则: 用反引号包裹 2023年 05月 12日 星期五 11:28:15 CST [root@node1 ~]# echo $(date) 2023年 05月 12日 星期五 11:28:23 CST # 如果要执行Linux命令, 则: 用$()包裹 [root@node1 ~]# dt=`date` [root@node1 ~]# echo $dt 2023年 05月 12日 星期五 11:29:00 CST [root@node1 ~]# dt2=$(date) [root@node1 ~]# echo $dt2 2023年 05月 12日 星期五 11:29:16 CST # 扩展, 只读变量, 只能设置一次值, 不允许修改值, 不允许删除(重启虚拟机后会自动删除) [root@node1 ~]# name=zhangsan [root@node1 ~]# name=lisi [root@node1 ~]# echo $name lisi [root@node1 ~]# readonly name # 设置name变量为: 只读变量. [root@node1 ~]# name=wangwu # 只读变量不能修改值. -bash: name: 只读变量 [root@node1 ~]# unset name # 不能直接删除只读变量 -bash: unset: name: 无法反设定: 只读 variable [root@node1 ~]#
1.4 Shell--编写及运行
# 应用场景 Shell命令适合于 比较简单的业务场景, 执行之后, 如果关闭了CRT, Tabby, 则这些命令也会被清理掉. Shell脚本适用于 比较复杂的业务场景, 执行之后, (Shell脚本)文件还在. # 如何编写Shell脚本? 1. 在后缀名为 .sh 的文件中进行编写. 2. 第一行代码为: 指定用什么Shell解析器来解析该脚本, 一般写 #!/bin/bash 3. 除了第1行的#之外, 后续的#全部是 注释的意思. 4. 例如: 如下的Shell脚本, vim 1.sh #!/bin/bash # 如下是输出一些文字到控制台 echo '故人西辞富士康, ' echo '为学技术到蓝翔. ' echo '蓝翔毕业包分配, ' echo '尼玛还是富士康. ' name='zhangsan' echo "我的名字叫: ${name}" dt=$(date) echo '当前的时间是 '$dt'' # 如何运行Shell脚本呢? 1. sh 脚本名.sh # 官方推荐, 不需要对Linux脚本有执行权. 2. source 脚本名.sh # 野路子写法, 不需要对Linux脚本有执行权. 3. 相对路径. # 必须对Linux脚本有执行权. 4. 绝对路径. # 必须对Linux脚本有执行权.
1.5 Shell--动态传参
# 如下是和动态传参相关的内容 echo "当前的文件名是: $0" echo "接收到的参数总个数为: $#" echo "接收到的所有参数为: $*" echo "第1个参数值为: $1" echo "第2个参数值为: $2" echo "第3个参数值为: $3"
1.6 Shell-if语句入门
数字: 运算符 说明 -eq 检测两个数是否相等,相等返回 true。 -ne 检测两个数是否不相等,不相等返回 true。 -gt 检测左边的数是否大于右边的,如果是,则返回 true。 -lt 检测左边的数是否小于右边的,如果是,则返回 true。 -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 字符串: 判断符 说明 -n STRING 字符串长度不为零 -z STRING 字符串长度为0 = 判断两个字符串是否一样 != 判断两个字符串是否不一样 文件 判断符 说明 -f 存在且是普通文件 -d 存在且是目录 -h 存在且是符号链接 -e 文件存在 –r 文件存在并且可读 –w 文件存在并且可写 –x 文件存在并且可执行 if语句 if 语句语法格式: if [ condition ] //条件, 条件要用 [] 包裹.并且两把要有空格隔开 then command1 //符合条件后, 就会执行这里的内容 command2 ... commandN fi 注意: 不允许将以上格式 写成一行. # 案例 案例1: 判断当前系统是否有多个ssh进程,如果有则打印true test1.sh //这是SHELL脚本文件, 以下是里边的内容. #!/bin/bash if [ $(ps -ef | grep -c "ssh") -gt 1 ] //这里的-c就是count的意思, 即: 统计个数的. then echo "true" fi //上述的if也可以改成: if [ `ps -ef | grep -c "ssh"` -gt 1 ] 这种写法. 案例2: 判断/media/cdrom目录是否存在,若不存在就去创建这个目录 test2.sh //这是SHELL脚本文件, 以下是里边的内容. #!/bin/bash DIR="/media/cdrom" if [ ! -d $DIR ] then mkdir -p $DIR fi #Shell--if-else语句 if else 语法格式: if condition //条件, 用[]包裹 then command1 //符合条件后, 执行的内容 command2 ... commandN else command //不符合条件后, 执行的内容. fi #if语句结合test语法 替换[] if test $age -ge 18 then echo '恭喜您, 成年了, 可以上网了!' else # 3. 走这里是未成年, 进行相应的提示即可. echo '小屁孩儿, 滚回去学习!' fi #if-else if语句 if else-if else 语法格式: if condition1 # 条件1 then command1 # 满足条件1后, 执行的内容 elif condition2 # 条件2 then command2 # 满足条件2后, 执行的内容 else commandN # 所有条件都不满足, 则执行这里. fi
1.7 Shell--for循环讲解
# for格式1: 字符型循环. 格式: for 变量 in 值1 值2 值3… do 程序 done 示例: # 案例6: 演示for循环, 字符型循环. for i in 11 22 33 do echo $i done # for格式2: 数字型循环. 格式: for ((初始值;循环控制条件;变量变化)) do 程序 done` 示例: # 需求:求1-100的和, for版 sum=0 # 2. 获取 1 ~ 100之间所有的整数. for ((i=1; i <= 100; i++ )) do # 3. 依次累加给变量sum # 思路: sum=sum + i # sum=$(($sum + $i)) # 写法1: $(( a + b )) # sum=$[$sum + $i] # 写法2: $[ a + b ] sum=`expr $sum + $i` # 写法3: `expr a + b` done # 4. 打印结果. echo "求和结果为: $sum"
1.8 Shell--while循环讲解
# 入门案例 #!/bin/bash # 需求: while循环入门, 打印1 ~ 5数字 # 初始化条件 i=1 # 判断条件 while (( $i <= 5 )) do # 循环体 echo $i # 控制条件 # i=$(($i + 1)) # i=$[$i + 1] # i=`expr $i + 1` let "i++" # let后边可以跟1个或者多个表达式, 表达式中的变量可以直接写, 不用写$符号了. done # while求和 #!/bin/bash # 需求:求1-100的和, while版 # 1. 定义求和变量, 记录求和结果 sum=0 i=1 # 2. 获取 1 ~ 100之间所有的整数. while ((i <= 100)) do # 3. 依次累加给变量sum let sum=sum+i # 求和 let i++ # 自增 done # 4. 打印结果. echo "求和结果为: $sum