2-shell高级
根文件有关系的变量
$? 获取文件执行或者命令执行的返回状态值
返回的状态值为0,表示执行成功。非0则表示文件或命令未找到
编辑一个文件 lingshi.sh 代码如下
#!/bin/bash #这是一个临时的文件 echo '张彪' echo $?
执行该文件
bash linshi.sh
如想要知道一个脚本中的命令有没有执行成功
vim ceshi.sh代码如下:
#!/bin/bash # 文件执行返回状态值演示 cd //home/python/Desktop/3-shell/2-day echo "执行返回状态值是 $?" pwd echo "执行返回状态值是 $?" ./ceshi.sh echo "执行返回状态值是 $?"
执行该脚本
bash ceshi.sh
由于ceshi.sh不是可执行文件,脚本中 ./ceshi.sh这条命令没有执行成功
内置变量之字符相关
获取随机的字符串
场景:创建一个用户,密码是随机生成的
生成随机数: $RANDOM 生成随机的5位数以内的数字
echo $RANDOM
把生成的随机数进行md5加密用到md5sum
加密后,会返回两部分的内容
echo $RANDOM | md5sum
需求来了,加密输出的结果返回两部分的内容,我只需要前面的一部分,这时候就要用到 awk '{print $1}' 命令获取第一部分的内容
echo $RANDOM | md5sum | awk '{print $1}'
每次都写那么长的命令,显得特别的麻烦,这时候可以考虑,把这条命令复制给一个命令变量
str=$(echo $RANDOM | md5sum | awk '{print $1}') echo $str
字符串相关的内置变量:截取
${变量名:起始位置:截取长度}
示例:从头截取8个字符
echo $str echo ${str:0:8}
示例:从末尾截取8个字符
echo ${str: -8} echo ${str:0-8}
内置变量之默认值
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式如下:
${变量名:-默认值}
套餐案例:
如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"
编辑一个文件taocan.sh代码如下:
#!/bin/bash # 套餐选择演示 a="$1" echo "您选择的套餐是: 套餐 ${a:-1}"
执行脚本文件
# 没选择,默认的套餐 bash taocan.sh # 选择第二种套餐 bash taocan.sh 2
场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
编辑一个脚本morenzhi2.sh 代码如下:
#!/bin/bash # 默认值演示示例二 a="$1" echo "我认为国家的法定年龄是${a}" echo "国家法定结婚年龄(男性)是 ${a+22} 岁"
执行该脚本
bash morenzhi2.sh bash morenzhi2.sh 23
shell 表达式
shell验证操作
方式一:
[ 表达式 ]
0 代表 真,条件成了
1 代表假,条件不成了
# 条件成立 [ 1 = 1 ] echo $? # 条件不成立 [ 1 = 2 ] echo $?
方式二:
test 表达式
0 代表 真,条件成了
1 代表假,条件不成了
# 条件成立 test 1 = 1 echo $? # 条件不成立 test 1 = 2 echo $?
shell表达式
逻辑相关
&&
命令1 && 命令2
特性:夫唱妇随
如果命令1执行成功,那么我才执行命令2 -- 夫唱妇随
如果命令1执行失败,那么命令2也不执行
# 条件成立,执行后面的 [ 1 = 1 ] && echo "条件成立" # 条件不成立,不执行后面的操作 [ 1 = 2 ] && echo "条件成立"
||
命令1 || 命令2
特性:和前面的对着干,相反
如果命令1执行成功,那么命令2不执行 -- 对着干
如果命令1执行失败,那么命令2执行
# 前面条件不成立,后面执行 [ 1 = 2 ] || echo "条件不成立" # 前面条件成立,后面不执行 [ 1 = 2 ] || echo "条件不成立"
文件相关
-f 判断输入内容是否是一个文件 -d 判断输入内容是否是一个目录 -x 判断输入内容是否可执行
先 ls 查看当前目录下的所有文件
例子:
-f 判断输入内容是否是一个文件
[ -f ceshi.sh ] && echo "是一个文件"
例子:
-d 判断输入内容是否是一个目录
[ -d linshi ] && echo "是一个目录"
例子:
-x 判断输入内容是否可执行
[ -x linshi.sh ] && echo "可执行"
数字相关
-gt 大于 -lt 小于 -eq 等于 -ne 不等于
创建一个 num2.sh 传入的位置参数等于两个,脚本才会运行,代码如下:
#!/bin/bash # 数字表达式 -ne使用场景,传入两个参数脚本才会运行 [ "$#" -ne 2 ] && echo " $0 脚本使用帮助信息: $0 [ arg1 arg2 ]" [ "$#" -eq 2 ] && echo "$0 脚本正在执行......"
运行该脚本
# 传入两个参数,脚本运行 bash num2.sh 1 2 # 不传参数,或者传的参数不是两个脚本都不会运行 bash num2.sh
字符串相关
== 两侧的内容是一致的 != 两侧的内容是不一致的
创建一个 str.sh 的脚本文件,代码如下:
#!/bin/bash # 字符串表达式的演示 a="$1" b="$2" [ "${a}" == "${b}" ] && echo "您输入的两个参数内容是一致的" [ "${a}" != "${b}" ] && echo "您输入的两个参数内容是不一致的"
执行脚本,分别传入不同的位置参数:
bash str.sh s bash str.sh s a bash str.sh s s bash str.sh
流程控制
简单流程控制
shell中的if,不论是单if还是多elif后面紧跟的是then,见if下面就会有then,结尾的固定是fi
单if语句:
if 条件 then 执行语句 fi
场景:
单一条件,只有一个输出
示例:
如果我输入内容是 nan,则返回你的性别是男
创建脚本danif.sh ,代码如下:
#!/bin/bash # 单if语句的使用场景 arg=$1 if [ "${arg}" == "nan" ] then echo "您的性别是 男" fi
执行该脚本
bash danif.sh nan bash danif.sh nv
双if语句
一个条件,两种结果
if 条件1 then 执行语句1 elif 条件2 then 执行语句2 else 执行语句3 fi
创建一个脚本shuangif.sh代码如下:
#!/bin/bash # 单if语句的使用场景 if [ "$1" == "nan" ] then echo "您的性别是 男" else echo "您的性别是 女" fi
执行该脚本文件
bash shuangif.sh nan
bash shuangif.sh nv
bash shuangif.sh nvdsaf
多if语句:
if 条件1 then 执行语句1 elif 条件2 then 执行语句2 else 执行语句3 fi
场景:
n个条件,n+1个结果
创建一个脚本duoif.sh代码如下:
#!/bin/bash # 单if语句的使用场景 if [ "$1" == "nan" ] then echo "您的性别是 男" elif [ "$1" == "nv" ] then echo "您的性别是 女" else echo "您的性别,我不知道" fi
执行该脚本文件
bash duoif.sh nan bash duoif.sh nv bash duoif.sh n
case语句
有一个案例来引出case语句
模拟对网卡服务的一些操作
/etc/init.d/networking
创建一个脚本zonghe.sh代码如下:
#!/bin/bash # 多if语句的使用场景 if [ "$1" == "start" ] then echo "启动 $0 脚本" elif [ "$1" == "stop" ] then echo "关闭 $0 脚本" elif [ "$1" == "restart" ] then echo "重启 $0 脚本" else echo "$0 脚本的使用方式: $0 [ start | stop | restart ]" fi
执行该脚本
bash zonghe.sh
bash zonghe.sh start
case语句
case 值 in 值1) 执行语句 ;; 值2) 执行语句 ;; 值3) 执行语句 ;; 值4) 执行语句 ;; esac
场景:服务启动
创建一个脚本文件cash.sh代码如下:
#!/bin/bash # case语句使用场景 case "$1" in "start") echo "启动 $0 脚本" ;; "stop") echo "关闭 $0 脚本" ;; "restart") echo "重启 $0 脚本" ;; *) echo "$0 脚本的使用方式: $0 [ start | stop | restart ]" ;; esac
执行该脚本文件
bash cash.sh
bash cash.sh start
循环
for循环
for 条件 do 执行语句 done
场景:
遍历列表
示例:遍历当前文件下的所有文件
查看当前文件下的所有文件和当前的路径
pwd ls
创建一个脚本文件for.sh代码如下:
#!/bin/bash #for语句 for i in `ls /home/python/Desktop/3-shell/2-day` do echo "该文件下有$i文件" done
执行该脚本
bash for.sh
shell中变量的计算方法
格式;
let 变量名a=变量名a+1 a=$((变量名a+1))
实例如下:
a=1 let a=a+1 echo $a a=$((a+1)) echo $a
while 语句:
while 条件 do 执行语句 done
创建脚本文件while.sh代码如下:
#!/bin/bash #while语句 a=1 while [ $a -lt 5 ] do echo $a let a=a+1 done
执行该脚本文件
bash while.sh
until 语句:
条件不满足一值往下执行,条件满足退出循环
until 条件
do
执行语句
done
创建脚本until.sh代码如下:
#!/bin/bash # until的示例 a=1 until [ "${a}" -gt 4 ] do echo "${a}" a=$((a+1)) done
执行该脚本
bash until.sh
复杂流程控制
shell函数格式
定义函数:
函数名(){ 函数体 }
调用函数:
函数名
创建一个脚本fun.sh代码如下:
#!/bin/bash # 函数使用场景一:执行频繁的命令 # 定义一个函数 dayin(){ echo "wo de mingzi shi" } #调用函数 dayin
执行该脚本
bash fun.sh
给函数传参数
创建一个脚本fun_chuangcan.sh代码如下:
#!/bin/bash # 函数的使用场景二 # 函数接受的参数用位置参数来表示 dayin(){ echo "wo de mingzi shi $1" } # 调用并传递参数 dayin 111
执行该脚本
bash fun_chuancan.sh
还可以手动的传参数代码如下:
#!/bin/bash # 函数的使用场景二 # 函数接受的参数用位置参数来表示 dayin(){ echo "wo de mingzi shi $1" } # 调用并传递参数 dayin $1
执行该脚本
bash fun_chuancan.sh sassaass
函数使用场景:
执行频繁的命令
执行命令格式相近的命令
函数使用场景一:执行频繁的命令
创建一个脚本fun1.sh代码如下:
#!/bin/bash # 函数使用场景一:执行频繁的命令 dayin(){ echo "wo de mingzi shi 111" } dayin dayin dayin dayin dayin dayin
执行该脚本文件
bash fun1.sh
场景二:执行命令格式相近的命令
创建一个脚本fun2.sh代码如下:
#!/bin/bash # 函数的使用场景二 dayin(){ echo "wo de mingzi shi $1" } dayin a dayin b dayin c dayin d dayin e
执行该脚本文件
bash fun2.sh
函数传参多个,函数体内调用示例
创建一个脚本fun3.sh代码如下:
#!/bin/bash # 函数的使用场景二 dayin(){ echo "wo de mingzi shi $1" echo "wo de mingzi shi $2" echo "wo de mingzi shi $3" } dayin 111 df dfs
执行该脚本
bash fun3.sh