一、在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

作业:

      数组的方式实现双色球