Shell脚本的进阶技巧:
一、String 类的技巧
String类当作数组来使用,注意范围的下标,0:4,4最后要被踢掉,实际是0-3,共4个字符:
string="Bash is great!"
echo ${string:8} # great!
echo ${string:0:4} # Bash
echo ${string:8:-1} # great (-1: upto 1st element from right)
数组的长度:
string="Bash is great!";
len=${#string}
echo "len = $len"
字符串的替换:
string="Bash is great!!"
echo ${string/Bash/GNU Bash} # GNU Bash is great!!
echo ${string//!/.} # Bash is great..
大小写替换:
string="Bash"
echo ${string^^} # BASH
echo ${string,,} # bash
按index存取数组中字符在shell中不可用,但是可以用function变相实现:
function charAt() {
string=$1
i=$2
echo ${string:i:1}
}
echo $(charAt "Hello" 2) # l
echo $(charAt "Hello" 1) # e
二、数组和字典
定义一个数组并且遍历它:
A=(2 4 5 6 4)
for i in ${A[@]}; do
echo -n "${i} " # 2 4 5 6 4
done
同样对数组进行切割:
A=(2 4 5 6 4)
echo ${A[@]:2:3} # 5 6 4
echo ${A[@]:0:1} # 2
Bash 中的数组需要使用 [@] 符号来引用整个数组,可以用简洁的语法对数组增加元素
A=(1 2 3)
A+=(4)
echo ${A[@]} # 1 2 3 4
A+=(5 6)
echo ${A[@]} # 1 2 3 4 5 6
字典也一样
declare -A D
D=(["one"]=1 ["two"]=2 ["three"]=3)
for i in ${!D[@]}; do
echo "$i -> ${D[$i]}" # one -> 1 ....
done
三、数学计算
简单的数学计算可以用 $((...)) 来完成:
a=10
b=5
echo "$a + $b = $((a + b))" # 10 + 5 = 15
echo "$a - $b = $((a - b))" # 10 - 5 = 5
echo "$a x $b = $((a * b))" # 10 x 5 = 50
echo "$a / $b = $((a / b))" # 10 / 5 = 2
echo "$a % $b = $((a % b))" # 10 % 5 = 0
或者借助复杂一点的 bc 来完成:
a=10
b=5.7
echo "$a / $b = $(echo "scale = 2; $a / $b" | bc)" # 10 / 5.7 = 1.75
随机数的产生:
echo $(($RANDOM % 10)) # Random number between 0 and 10
四、输入
控制输入变量:
read -p "Enter your name: " name
echo "Hello, $name"
如果要输入数组:
read -p "Enter numbers: " -a A
echo ${A[@]}
借助上面的技巧,我们可以写出一些复杂的 shell 脚本了