shell编程四-字符串数组
字符串
单引号:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号:
- 双引号里可以有变量
- 双引号里可以出现转义字符 拼接字符串:
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
获取字符串长度
string="abcd"
echo ${#string} #输出 4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #输出liba
#%
截取字符串
#!/bin/bash
str=http://example.com
echo ${str#*p} #://example.com
echo ${str##*p} #le.com
echo ${str%.com} #http://example
echo ${str%%e*} #http://
数组
在Shell中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
读取数组
${数组名[下标]}
使用@符号可以获取数组中的所有元素
echo ${array_name[@]}
获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
示例
类似maven的配置替换功能,把一个文件中的配置替换所有xml和properties中的${key}。
#!/bin/sh
#获取config.xml中配置
propFile=`sed -n 's/.*>\(.*\)<\/properties_path>/\1/p' config.xml`
echo "配置文件位置:${propFile}"
BASE_DIR=`sed -n 's/.*>\(.*\)<\/base_dir>/\1/p' config.xml`
echo "要替换的目录:${propFile}"
declare -A array
declare -a keys=()
declare -a vals=()
while IFS='=' read -r key val
do
#忽略空行和注释
[[ $key = '#'* ]] && continue
[[ $key == '' ]] && continue
#去除两端空格
key=`echo "${key}" | awk '{sub(/^ */,"");sub(/ *$/,"")}1'`
val=`echo "${val}" | awk '{sub(/^ */,"");sub(/ *$/,"")}1'`
array["$key"]="$val"
keys+=("$key"); vals+=("$val")
done < $propFile
echo "键值对数量为: ${#keys[@]} or ${#array[@]}"
#查找目录下所有.xml和.properties
files=`find "${BASE_DIR}" -regex '.*\.xml\|.*\.properties'`
for ((i = 0; i < ${#keys[@]}; i++))
do
for file in $files
do
sed -i "s#\${${keys[i]}}#${vals[i]/&/\&}#g" ${file}
done
done