数组
 
变量:内存的存储空间;
变量的特点:每个变量中只能存放一个数据,变量只能进行一次性的赋值;

存放本班每个人的名字于变量:
 1.一次性赋值:
  NAME="name1 name2 name3 ..."
 2.使用多个变量,分别赋值:
  NAME1=xu
  NAME2=shen
 3.数组变量:

数组:存放一个或多个元素的连续的内存空间;相当于多个变量的集合;
数组元素:数组中任何一个存放数据的存储单元;
数组的索引:
 1.数字:索引数组(Index ARRAY)
  0,1,2,...
 2.名称(字符串):关联数组(Related ARRAY)
  bash4.0以上的版本才支持;

稠密数组和稀疏数组:
 稠密数组:索引编号必须连续
 稀疏数组:索引编号可以不连续,bash数组属于此类;

声明数组:
 1.declare命令
  declare -i NAME:将NAME声明为整型变量;
  declare -x NAME:将NAME声明为环境变量;

  declare -a NAME:将NAME声明为索引数组(如果支持);
  declare -A NAME:将NAME声明为关联数组(如果支持);

  declare -a NAME=("value1" "value2" "value3" ...)
  declare -a NAME=([0]="value1" [1]="value2" [5]="value3" ...)

 2.直接声明数组:
  直接为数组赋值:
   ARRAY_NAME=("value1" "value2" "value3" ...) 声明稠密数组;
   ARRAY_NAME=([0]="value1" [1]="value2" [5]="value3" ...) 声明稀疏数组;

 3.定义数组的元素而创建数组:
  ARRAY_NAME[0]=value1
  ARRAY_NAME[1]=value2
  ...

引用数组中元素:
 引用变量的方法:${NAME}
 引用数组元素的方法:${ARRAY_NAME[INDEX]}
  注意:如果不给出INDEX,则表示引用数组的第一个元素,即INDEX=0的元素;
 引用整个数组的所有元素:${ARRAY_ANME[*]}或者${ARRAY_ANME[@]}
 引用数组的索引:${!ARRAY_ANME[*]}或者${!ARRAY_ANME[@]}

查看数组的长度(数组中有效元素的个数)
 ${#ARRAY_NAME[*]} 或者 ${#ARRAY_NAME[@]}

数组切片:
 ${ARRAY_NAME:offset}:显示包括offset数字所表示的索引位置及以后的所有元素;
  ${ARRAY_NAME:6}:跳过0-5,从6开始显示
 ${ARRAY_NAME:offset:number}:显示包括offset数字所表示的索引位置及以后的number个元素;${ARRAY_NAME:6:3}:跳过0-5,从6开始显示3个元素;

想数组中追加元素:
 1.稠密数组:
  ARRAY_NAME[${#ARRAY_NAME[*]}]=valueN
  0 1 2 3 4 5 6 7
 2.稀疏数组:
  ARRAY_ANME[INDEX]=valueN
   注意:INDEX必须为未被使用的数组元素索引编号;

撤销数组:
 usnet ARRAY_NAME

删除数组中的元素:
 unset ARRAY_NAME[INDEX]

RANDOM变量:0-32767
 熵池
 /dev/random
 /dev/urandom

bash脚本编程:
写一个脚本:
 创建一个用户alice,如果该用户已经存在,就提示用户已经存在的信息;否则将创建用户;

shell脚本编程的特点:
 过程式编程语言
 脚本类语言
 解释型语言

过程式编程语言:
 顺序执行结构:
  以从左到右,从上到下顺序执行所有的语句(命令)
  shell脚本的主体结构;

 选择执行结构:
  依照给定条件的逻辑判断结果或者依照可选的取值范围,进而选择某个分支中的语句来执行;
  if:分支选择标准:逻辑判断的结果;
  case:分支选择标准:根据可选的取值;

 循环执行结构:
  对于某特定语句,重复执行0次,1次或多次;
  for:遍历指定的列表;
  while:根据逻辑判断的结果;
  until:根据逻辑判断的结果;
  select:死循环,利用循环机制提供选择列表;

选择执行结构:
 if语句:
  if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

 if语句单分支结构:如果条件为真,则执行then后的命令,否则,不做任何操作;
  if CONDITION
  then STATEMENT
  fi

  if CONDITION ; then
   STATEMENT1
   STATEMENT2
   ...
  fi

 注意:想要执行then后面的STATEMENTS,前提条件是CONDITION部分为真;

 if语句的双分支结构:如果条件为真,就执行then后面的命令;否则就执行else后面的命令;
  if CONDITION ; then
   STATEMENT
   ...
  else
   STATEMENT
   ...
  fi

 if语句的多分支结构:首先判断CONDITION1是否为真,如果为真,则执行第一个then后面的语句;否则就判断CONDITION2是否为真,如果为真,就执行第二个then后面的语句;否则就判断CONDITION3是否为真,如果为真,就执行第三个then后面的语句...;如果所有的CONDITION都为假,就执行else后面的语句;
  if CONDITION1 ; then
   STATEMENT
   ...
  elif CONDITION2 ; then
   STATEMENT
   ...
  elif CONDITION3 ; then
    STATEMENT
    ...
  ...
  else
   STATEMENT
   ...
  fi

 建议:if多分支结构,能不用就不用;