linux--变量篇

发布时间 2023-04-11 00:49:51作者: 郭小睿

变量篇

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路径代替

变量子串

子串的语法和功能

img

说明:子串可以是一个正则表达式。

提取字符串和计算长度案例

img

匹配子串删除字符串案例

img

变量赋值三种方法

定义法

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))"

img

read读入

-p 提示,-t 等待用户输入的时间

#!/bin/bash
read -t 30  -p "请输入一个数字:" a
echo "你输入的数字是:$a"

img

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

img