# 定义数组 ARR=(a b c) # ARR[@]: 数组转换为字符串 echo "${ARR[@]}" a b c # ARR[*] echo "${ARR[*]}" a b c # 数组赋值 ANOTHER=("${ARR[@]}") # 长度 echo ${#ARR[@]} 3 # 序号 for idx in "${!ARR[@]}"; do echo "$idx" done
[@] VS [*]
数组的 [@] 和 [*] 都是取所有元素,但是有所差别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 定义 $ ARR=(a b c) $ A=("${ARR[@]}") $ B=("${ARR[*]}") # A $ echo${#A[@]} 3 $ echo${A[@]} a b c # B $ echo${#B[@]} 1 $ echo${B[@]} a b c
布尔
1 2 3 4
FLAG=true if [[ $FLAG == true ]]; then # do something fi
IFS=';' read -ra ADDR <<< "$IN" # 按 ; 分割 for i in "${ADDR[@]}"; do # process "$i" done
替换
1
echo ${LINE//{old}/{new}}
循环
while
语法
1 2 3 4
while command do Statement(s) to be executed if command is true done
示例
1 2 3 4 5 6 7 8 9
a=0 while [ $a -lt 10 ] do echo $a a=`expr $a + 1` done # 等待 port while ! lsof -i:8080; do echo "wait for server ready"; sleep 1; done
数组
1 2 3 4 5 6 7 8 9 10
# 命令行 $ countries=(china us); for country in${countries[@]}; echo$country china us # 脚本 countries=(china us) for country in ${countries[@]}; do echo $country done
范围
1 2 3 4 5 6 7 8 9 10 11 12 13
$ foridin {1..3}; echo$id# 1 2 3 # 脚本 for id in {1..3}; do echo $id done # seq [首数] [增量] 尾数 $ seq 1 3 # [1, 3] $ seq 3 # [1, 3] $ seq 1 2 5 # 1, 3, 5 $ for i in `seq 3`; doecho$i; done# 1 2 3
case…esac
1 2 3 4 5 6 7 8 9 10 11 12
word=a case $word in a) echo "a $word" ;; b) echo "b $word" ;; *) echo "* $word" ;; esac
getopts
参数
1 2 3 4 5 6
# opts :前缀 忽略错误 :后缀 参数后必须有值 # example :abc:de: 忽略参数错误,-c、-e后必须有值
while getopts ":ab:Bc:" opt; do case $opt in a) echo "found -a" ; a="hello" ;; b) echo "found -b and value is: $OPTARG" ;; c) echo "found -c and value is: $OPTARG" ;; *) usage ;; esac done