shell 数组、字典、source、split简单实例

1.字典、数组示例

echo "shell定义字典"
#必须先声明
declare -A dic
dic=([key1]="value1" [key2]="value2" [key3]="value3")

#打印指定key的value
echo ${dic["key1"]}
#打印所有key值
echo ${!dic[*]}
#打印所有value
echo ${dic[*]}
#字典添加一个新元素
dic+=([key4]="value4"#遍历key值
for key in $(echo ${!dic[*]})
do
    echo "$key : ${dic[$key]}"
done

echo "shell定义数组"

#数组
list=("value1" "value2" "value3")
#打印指定下标
echo ${list[1]}
#打印所有下标
echo ${!list[*]}
#打印数组下标
echo ${list[*]}
#数组增加一个元素
list=("${list[@]}" "value3")

#按序号遍历
for i in "${!arr[@]}"; do 
    printf "%s\t%s\n" "$i" "${arr[$i]}"
done

#按数据遍历
for NUM in ${ARR[*]}
do
    echo $NUM
done

2.字典、数组应用实例:
例如:已知 Java=Hostname1;Hostname1=192.168.1.1=>想得到Java=192.168.1.1;其中已知分别包含在两个文件中
role.ini中:

es=node1,node2,node3
filebeat=node1,node3,node4,node5
logstash=node1
kibana=node1

iplist.ini中为:

node1=192.168.1.1
node2=192.168.1.2
node3=192.168.1.3
node4=192.168.1.4
node5=192.168.1.5
node6=192.168.1.6

需求:从role.ini 和 iplist.ini中得到role 和 ip的一一对应关系
shell:

#role.ini字典;iplist字典;结果role--ip字典
declare -A IPListDict
declare -A RoleListDict
declare -A RoleIPDict
#source相当于执行一次外部脚本,但是并不会另起线程执行,所以其值可以在父shell中使用
function initIPListDict(){
    file=$1
    eval "source ${file}"
    IPListDict=([node1]=$node1 [node2]=$node2 [node3]=$node3 [node4]=$node4 [node5]=$node5 [node6]=$node6)
}
function initRoleListDict(){
    file=$1
    eval "source ${file}"
    RoleListDict=([es]=${es} [filebeat]=${filebeat} [logstash]=${logstash} [kibana]=${kibana})}
    #对于role.ini字典的key循环处理,切割value,作为iplist.ini中key,得到value并保存
function initRoleIPDict(){
   for key in $(echo ${!RoleListDict[*]})
   do
      OLD_IFS="$IFS"
      IFS=","
      arr=(${RoleListDict[$key]})
      IFS="$OLD_IFS"
      roleallip=""
      for element in ${arr[@]}   
        do  
          element=${IPListDict[$element]}
          roleallip=$roleallip$element","
        done
      roleallip=${roleallip%?}
      RoleIPDict[$key]=$roleallip
  done
 }

rolefile="/root/installHadoopCluster/role.ini"
iplistfile="/root/installHadoopCluster/iplist.ini"
initIPListDict ${iplistfile}
initRoleListDict ${rolefile}
initRoleIPDict

#测试结果RoleIP字典
for k in "${!RoleIPDict[@]}"
do
   echo $k"=="${RoleIPDict[$k]}
done

terminal 输出:
es==192.168.1.1,192.168.1.2,192.168.1.3
logstash==192.168.1.1
kibana==192.168.1.1
filebeat==192.168.1.1,192.168.1.3,192.168.1.4,192.168.1.5

3.字符串截取:
例如:
去掉末尾最后一个字符:

var=${var%?}

截取区间:

var=${var:1:5}

删除某一部分,可使用正则

var=${var/$delete/}

按照某一格式切割保存到数组

第一种方法:
   array=${var//,/ }
按照逗号切割字符串,将逗号转为空格,因为shell定界符默认是空格

第二种方法:
   OLD_IFS="$IFS"
   IFS=","
   array=($var)
   IFS="$OLD_IFS"
其中IFS保存的是shell定界符
阅读更多
个人分类: shell bash
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭