linux学习笔记-变量篇

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


数组基础

Shell的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量
数组也是一种变量变量,所以变量子串的相关功能数组也同样适用,数组下标默认是从0开始计数的。
数组的相关知识通过man bash然后搜Arrays来了解。

定义数组的方式

静态命名数组

  • 方法1[推荐]
    array1=(1 2 3)
    
  • 方法2
    array2=(
      www.baidu.com
      www.sina.com
    )
    
  • 方法3
    array=([0]=one [1]=two [2]=three [3]=four)
    

动态命令创建数组

array=($(ls))
array=(`ls`)

打印数组

打印所有元素:

$(array[@])
$(array[*])

打印数组长度:

$(#array[@])
$(#array[*])

打印单个元素:

$(array[i])

增改数组数据

增改

array[0]=one
array[1]=two
array[2]=three

如果对应的下标值不存在,则新赋值,如果已存在,则会覆盖原值

删除数组数据

因为数组本质上还是变量,因此可通过“unset 数组[下标]”清除相应的数组元素,如果不带下标,表示清除整个数组的所有数据。

unset array[1]
unset array

切片和替换[变量子串]

数组也是变量,因此也适合于前面讲解过的变量的子串处理的功能应用。

切片功能

array=(1 2 3 4 5)
echo ${array[@]:1:3}

2 3 4
从下标为1的元素开始截取,共取3个数组元素。其他用法参考变量子串的用法

替换

array=(1 2 3 1 1)   
echo ${array[@]/1/b}

b 2 3 b b
把数组中的1替换成b,原数组未被修改,和sed很像。其他用法参考变量子串的用法
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组

案例

内容打印数组元素个数

#!/bin/bash

a1=(1 2 3 4 5 6  7 8 9) && echo ${a1[@]}

echo ${#a1[@]}

echo ${a1[2]}

数组下标默认是从0开始计数的

for循环打印数组

用数组和for循环将“i am oldboy my teacher is luogang”这句话中,字符数小于等于6个的单词打印出来

三种写法

#!/bin/bash

a1=( i am oldboy my teacher is luogang )

for n in ${a1[*]}
do
  if [ `echo $n|wc -L` -le 6 ]
    then
      echo $n
  fi 
done

echo -----------

for n in ${a1[*]}
do
  if [ ${#n} -le 6 ]
    then
      echo $n
  fi
done

echo -----------------
for((i=0;i<${#a1[*]};i++))
do
  if [ ${#a1[i]} -le 6 ]
    then
      echo ${a1[i]}
  fi
done

img

posted @ 2023-04-11 00:40  郭小睿  阅读(77)  评论(0编辑  收藏  举报