shell编程四-字符串数组

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
CONTENTS