一、在shell中$*和$@的区别
$*和$@的区别
#! /bin/bash
for i in "$@"
# for i in $@
do
echo $i
done
echo "--------------------"
for i in "$*"
# for i in $*
do
echo $i
done
# bash a.sh 1 2 3 4
1
2
3
4
--------------------
1 2 3 4
$*和$@的唯一区别,被作为for循环取值范围时,如果加了双引号,$*会把所有的位置参数作为一个整体
二、数组
变量 一个变量只能存储一个value
数组 一个数组可以存储多个value
在bash shell中只支持一维数组(不支持多维),初始化不需要定义数组大小,数组的下标从0开始
例如:
arry1=[ (aaa),(bbb),(ccc),(ddd) ]
0 1 2 3
调用:
arry1[0]
arry1[2]
arry1[*]
arry1[@]
三、数组的定义方式
方式一:
declare -a 数组名称=(数组成员)
declare -a myarry=(5 6 7 8)
echo ${myarry[2]}
显示结果为 7
方式二:
数组名=(数组成员1 数组成员2 数组成员3)
arry1=( one two three four five six )
arry1=( one two three four five six )
echo ${arry1[3]}
一行一行读取文件内容
arry2=(`cat /root/user.txt`)
echo ${arry2[3]}
存在空格需要引起来变成一个整体
arry3=( one two "three four" five six )
echo ${arry3[2]}
可以在数组里定义变量
a=1
b=2
c=3
d=4
arry4=( $a $b $c $d)
echo ${arry4[2]}
# 数组成员不一定要连续
# 一部分数组成员允许不被初始化
# 数组中允许空缺元素存在
arry5=( 1 2 3 4 5 [10]=hello )
echo ${arry5[10]}
方式三:
直接定义下标
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
NAME[5]="ZZ"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
echo "sixth Index: ${NAME[5]}"
四、数组的引用
${数组名[下标]}
${数组名[*]}
${数组名[@]}
举例
#! /bin/bash
class=( 2020 2021 2022 2023 2024)
echo "下标为0的值为:${class[0]}"
echo "下标为3的值为:${class[3]}"
echo "所有的值为:${class[*]}"
echo "所有的值为:${class[@]}"
--------------
数组中"*" 和 "@" 区别
关于在shell脚本中数组变量中 “*”跟 “@” 区别
“*”当变量加上“” 会当成一串字符串处理.
“@”变量加上“” 依然当做数组处理.
在没有加上“” 的情况下 效果是等效的.
举例:
#! /bin/bash
class=( 2020 2021 2022 2023 2024)
for i in "${class[@]}"
# for i in ${class[@]}
do
echo $i
done
echo "---------------"
for i in "${class[*]}"
# for i in ${class[*]}
do
echo $i
done
输出结果
# bash a.sh
2020
2021
2022
2023
2024
---------------
2020 2021 2022 2023 2024
五、实现公司年会抽奖脚本
举例一:点名脚本
# cat user.txt
zhangsan
lisi
wangwu
tom
jerry
boss
ikun
# cat user.sh
#! /bin/bash
user_arr=(`cat /root/user.txt`) #读取文件里面的每一行
# user_res=(内定人员)
# i=1
user_res=()
i=0
while [ $i -lt $1 ]
do
user=${user_arr[$RANDOM%18]}
# 不希望抽到某位同学
#if [ "$user" = "名字" ];then
#continue
#fi
res=`echo ${user_res[@]} | grep -w $user`
if [ -z "$res" ];then
user_res[$i]=$user
let i++
fi
done
# 遍历输出
for name in ${user_res[@]}
do
echo $name
# 每次输出延时0.5秒
#sleep 0.5
done
作业:
数组的方式实现双色球