Fruits=('Apple' 'Banana' 'Orange')
Fruits[0]="Apple"
Fruits[1]="Banana"
Fruits[2]="Orange"
ARRAY1=(foo{1..2}) # => foo1 foo2
ARRAY2=({A..D}) # => A B C D
# 合并 => foo1 foo2 A B C D
ARRAY3=(${ARRAY1[@]} ${ARRAY2[@]})
# 声明构造
declare -a Numbers=(1 2 3)
Numbers+=(4 5) # 附加 => 1 2 3 4 5
索引
参数
描述
${Fruits[-1]}
最后一个元素
${Fruits[*]}
所有元素
${Fruits[@]}
所有元素
${#Fruits[@]}
总数
${#Fruits}
第一节长度
${#Fruits[3]}
第n个长度
${Fruits[@]:3:2}
范围
${!Fruits[@]}
所有 Key
迭代
Fruits=('Apple' 'Banana' 'Orange')
for e in "${Fruits[@]}"; do
echo $e
done
迭代指定下标
for i in "${!Fruits[@]}"; do
printf "%s\t%s\n" "$i" "${Fruits[$i]}"
done
数组操作
参数
描述
Fruits=(“${Fruits[@]}” “Watermelon”)
# 添加
Fruits+=(‘Watermelon’)
# 也是添加
Fruits=( ${Fruits[@]/Ap*/} )
# 通过正则表达式匹配删除
unset Fruits[2]
# 删除一项
Fruits=(“${Fruits[@]}”)
# 复制
Fruits=(“
F
r
u
i
t
s
[
@
]
"
"
{Fruits[@]}" "
Fruits[@]""{Veggies[@]}”)
# 连接
lines=(cat "logfile")
# 从文件中读取
数组作为参数
function extract()
{
local -n myarray=$1
local idx=$2
echo "${myarray[$idx]}"
}
Fruits=('Apple' 'Banana' 'Orange')
extract Fruits 2 # => Orangle
9.Bash 字典
定义
declare -A sounds
sounds[dog]="bark"
sounds[cow]="moo"
sounds[bird]="tweet"
sounds[wolf]="howl"
使用
echo ${sounds[dog]} # Dog's sound -> bark
echo ${sounds[@]} # All values
echo ${!sounds[@]} # All keys
echo ${#sounds[@]} # Number of elements
unset sounds[dog] # Delete dog
迭代
for val in "${sounds[@]}"; do
echo $val
done
for key in "${!sounds[@]}"; do
echo $key
done
10.Bash 条件语句
整数条件
参数
描述
[[ NUM -eq NUM ]]
等于 Equal
[[ NUM -ne NUM ]]
不等于 Not equal
[[ NUM -lt NUM ]]
小于 Less than
[[ NUM -le NUM ]]
小于等于 Less than or equal
[[ NUM -gt NUM ]]
大于 Greater than
[[ NUM -ge NUM ]]
大于等于 Greater than or equal
(( NUM < NUM ))
小于
(( NUM <= NUM ))
小于或等于
(( NUM > NUM ))
比…更大
(( NUM >= NUM ))
大于等于
字符串条件
参数
描述
[[ -z STR ]]
空字符串
[[ -n STR ]]
非空字符串
[[ STR == STR ]]
相等
[[ STR = STR ]]
相等(同上)
[[ STR < STR ]]
小于 (ASCII)
[[ STR > STR ]]
大于 (ASCII)
[[ STR != STR ]]
不相等
[[ STR =~ STR ]]
正则表达式
例子
字符串
if [[ -z "$string" ]]; then
echo "String is empty"
elif [[ -n "$string" ]]; then
echo "String is not empty"
else
echo "This never happens"
fi
组合
if [[ X && Y ]]; then
...
fi
相等
if [[ "$A" == "$B" ]]; then
...
fi
正则表达式
if [[ '1. abc' =~ ([a-z]+) ]]; then
echo ${BASH_REMATCH[1]}
fi
小于
if (( $a < $b )); then
echo "$a is smaller than $b"
fi
存在
if [[ -e "file.txt" ]]; then
echo "file exists"
fi
文件条件
参数
描述
[[ -e FILE ]]
存在
[[ -d FILE ]]
目录
[[ -f FILE ]]
文件
[[ -h FILE ]]
符号链接
[[ -s FILE ]]
大小 > 0 字节
[[ -r FILE ]]
可读
[[ -w FILE ]]
可写
[[ -x FILE ]]
可执行文件
[[ f1 -nt f2 ]]
f1 比 f2 新
[[ f1 -ot f2 ]]
f2 比 f1 新
[[ f1 -ef f2 ]]
相同的文件
更多条件
参数
描述
[[ -o noclobber ]]
如果启用 OPTION
[[ ! EXPR ]]
不是 Not
[[ X && Y ]]
和 And
[[ X
逻辑和,或
if [ "$1" = 'y' -a $2 -gt 0 ]; then
echo "yes"
fi
if [ "$1" = 'n' -o $2 -lt 0 ]; then
echo "no"
fi
10.Bash基本循环
基本For循环
for i in /etc/rc.*; do
echo $i
done
类似c的for循环
for ((i = 0 ; i < 100 ; i++)); do
echo $i
done
范围
for i in {1..5}; do
echo "Welcome $i"
done
步长
for i in {5..50..5}; do
echo "Welcome $i"
done
自动递增
i=1
while [[ $i -lt 4 ]]; do
echo "Number: $i"
((i++))
done
自动递减
i=3
while [[ $i -gt 0 ]]; do
echo "Number: $i"
((i--))
done
Continue
for number in $(seq 1 3); do
if [[ $number == 2 ]]; then
continue;
fi
echo "$number"
done
Break
for number in $(seq 1 3); do
if [[ $number == 2 ]]; then
# Skip entire rest of loop.
break;
fi
# This will only print 1
echo "$number"
done
until
count=0
until [ $count -gt 10 ]; do
echo "$count"
((count++))
done