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路径代替
变量子串
子串的语法和功能
说明:子串可以是一个正则表达式。
提取字符串和计算长度案例
匹配子串删除字符串案例
变量赋值三种方法
定义法
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
数组基础
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