变量篇
shell位置变量
#!/bin/bash
# 获取当前执行脚本的文件名
echo $0
# 获取当前脚本所有后面所接参数的总个数
echo $#
# 获取当前执行脚本的第1个参数
echo $1
# 获取当前脚本所有传参的参数
echo $*
echo $@
说明:$与 $@不同点:当被双引号包裹时,$@与没有被双引号包裹时没有变化,$@仍然是一个数组,每个参数依然是分割独立的;但当$被双引号包裹时,SHELL会将所有参数整合为一个字符串。
结果输出:

小练习
#!/bin/bash
if [ $# -ne 2 ] # 如果传入的参数不是2个
then
echo "/bin/sh $0 arg1 arg2"
exit 1 # 退出并返回1
fi
echo $1 $2 # 满足2个参数则执行命令
结果输出:

shell状态变量
特殊状态变量

$?用途详解
不同命令的执行结果中,$?的返回值不尽相同,但常用的就是0和非0两种状态,0表示成功,非0表示失败,可以通过获取返回值,来确定程序是否执行成功。
在对数据进行备份时,在执行完关键命令后,获取返回值,来确定命令是否成功,备份数据是否完成
在企业场景中,$?的用法如下
- 判断命令、脚本或函数等程序是否执行成功
- 在脚本中执行“exit 数字”,则会返回这个数字给
$?变量 - 如果是在函数中,则通过“return 数字”吧这个数字传给
$?
小练习
mv 123 ./123_bak
RETVAL=$? # 将$?的值赋值给变量RETVAL
echo
[ $RETVAL -eq 0 ] && {
echo 'ok'
}
echo $RETVAL
结果输出:

shell特殊变量
语法和功能

冒号非必须,省略冒号,则只针对未赋值的变量,加上冒号,就包括为空的变量
小练习
#!/bin/bash
echo 'echo ${var:-ttt}-->' ${var:-ttt}
echo 'echo $var-->' $var
echo 'echo ${var:=ttt}-->' ${var:=ttt}
echo 'echo $var-->' $var
echo 'echo ${var:+MMM}-->' ${var:+MMM}
echo 'echo $var-->' $var
echo 'unset var and echo ${var:?the error}-->'
unset var
echo ${var:?the error}
输出练习

企业工作用途
在企业中,针对目录路径等的处理就可以上述变量不存在则赋值的方式,防止因目录路径不存在而导致的异常,特别是针对变量的删除操作,这种方式很有用,否则删除的变量不存在时,可能导致未知的危险,
find ${path:-/tmp} -name "*.tar.gz" -type f -mtime +7|xargs rm -f
如上命令,当路径变量不存在时,用/tmp路径代替
变量子串
子串的语法和功能

说明:子串可以是一个正则表达式。
提取字符串和计算长度案例

匹配子串删除字符串案例

变量赋值三种方法
定义法
a=1
传参法
#!/bin/bash
a=$1
b=$2
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a/b=$(($a/$b))"
echo "a**b=$(($a**$b))"
echo "a%b=$(($a%$b))"

read读入
-p 提示,-t 等待用户输入的时间
#!/bin/bash
read -t 30 -p "请输入一个数字:" a
echo "你输入的数字是:$a"

read企业案例
判断输入的内容,并根据输入的序号进行相应的操作,脚本如下
#!/bin/bash
cat <<EOF
1.install lamp
2.install lnmp
3.exit
EOF
read -p "请选择一个序号(必须是数字):" num
# 判断是否为整数
expr 2 + $num &>/dev/null
if [ $? -ne 0 ]
then
echo "Usage:$0 {1|2|3}"
exit 1
fi
# 判断执行处理
if [ $num -eq 1 ]
then
echo "install lamp"
elif [ $num -eq 2 ]
then
echo "install lnmp"
elif [ $num -eq 3 ]
then
echo "bye~"
exit
else
echo "Usage:$0 {1|2|3}"
exit 1
fi
