我的任务是修改这个bash脚本,这个脚本中有一些我不太明白的语法。
在研究和研究一些bash之后,我理解了大多数人。关于在这里发布整个脚本我感觉很糟糕,但我不想隐藏任何可能使我更难回答问题的信息。
基本上我在理解以下脚本中可以找到的以下bash命令方面存在差距。
if [[ ${#} -eq 3 ]]; then
- 这里的$#
是什么?什么是[[]]
?eval HOSTNAME_PORT=\$$ENV
eval config_mapping_values=\$$MAPPING
- 这里有2美元?怎么了斜线IFS=',' read -a mapping_value_array <<< "$mapping_values_param"
"${!mapping_value_array[@]}"
- 循环开始时@符号是什么? type_name=$(echo $map_value_item | cut -d":" -f1)
- 为什么在括号的外部和内部使用$符号?完整的脚本:
#!/bin/sh
insert_mapping()
{
mapping_name_param=$1
mapping_values_param=$2
echo "Calling insert mapping: name: $mapping_name_param values: $mapping_values_param "
IFS=',' read -a mapping_value_array <<< "$mapping_values_param"
for index in "${!mapping_value_array[@]}"
do
map_value_item=${mapping_value_array[index]}
if [[ $index -eq 0 ]];then
echo "Calling Curl Command: curl -XPUT "$HOSTNAME_PORT/$mapping_name_param" -d @$map_value_item"
curl -XPUT "$HOSTNAME_PORT/$mapping_name_param" -d @$map_value_item
else
type_name=$(echo $map_value_item | cut -d":" -f1)
type_file=$(echo $map_value_item | cut -d":" -f2)
echo "Calling Curl Command: curl -XPUT "$HOSTNAME_PORT/$mapping_name_param/$type_name/_mapping" -d @$type_file"
curl -XPUT "$HOSTNAME_PORT/$mapping_name_param/$type_name/_mapping" -d @$type_file
fi
done
}
delete_mapping()
{
mapping_name_param=$1
echo "Calling Curl Command: curl -XDELETE "$HOSTNAME_PORT/$mapping_name_param""
curl -XDELETE "$HOSTNAME_PORT/$mapping_name_param"
}
#
# MAIN METHOD
#
source ./configure_es_mapping_util.cfg
if [[ ${#} -eq 3 ]]; then
export ENV=$1
export ACTION=$2
export MAPPING=$3
echo "ENV: $ENV ACTION $ACTION MAPPING $MAPPING"
eval HOSTNAME_PORT=\$$ENV
eval config_mapping_values=\$$MAPPING
if [[ "$ACTION" == "insert" || "$ACTION" == "INSERT" ]]; then
if [[ "$MAPPING" == "all" ]]; then
IFS=',' read -a all_mappings_array <<< "$all_mappings"
for i in "${all_mappings_array[@]}"
do
eval config_mapping_values=\$$i
insert_mapping $i $config_mapping_values
done
else
insert_mapping $MAPPING $config_mapping_values
fi
elif [[ "$ACTION" == "delete" || "$ACTION" == "DELETE" ]]; then
echo "Calling delete: $ACTION"
if [[ "$MAPPING" == "all" ]]; then
IFS=',' read -a all_mappings_array <<< "$all_mappings"
for i in "${all_mappings_array[@]}"
do
delete_mapping $i
done
else
delete_mapping $MAPPING
fi
else
echo "unknown action"
fi
else
echo "Invalid Arguments: Provide Env(ITE, QA, UAT, PROD) Action(INSERT, DELETE) Mapping(icrd_alerts)"
exit 1
fi
答案 0 :(得分:1)
if [[ ${#} -eq 3 ]]; then
此语句测试position parameters
的数量(例如命令行参数的数量)是否为3
。
eval HOSTNAME_PORT=\$$ENV eval config_mapping_values=\$$MAPPING
将eval
的参数读取并连接成一个命令。语法$$
是indirect reference
。在此处使用eval会导致HOSTNAME_PORT
设置为变量$(whatever $ENV is)
的值。因此,如果$ENV
包含“host1”,HOSTNAME_PORT=$host1
。这同样适用于config_mapping_values=\$$MAPPING
IFS=',' read -a mapping_value_array <<< "$mapping_values_param"
IFS
是Bash Internal Field Separator
(defautl为$' \t\n'
(空格标签换行符)),用于控制word-splitting
的发生方式。它会导致"$mapping_values_param"
中的字词在,
上拆分,并将结果读入数组mapping_value_array
。
"${!mapping_value_array[@]}" in the loop beginning I see this.
使用感叹号访问associative array
的键。在循环开始时,它只返回一个key
值列表来迭代。但是,由于数组mapping_value_array
是常规indexed
数组(参见上面的read -a mapping_value_array
),结果只是数组中每个元素的索引(例如0 1 2 3...
)
type_name=$(echo $map_value_item | cut -d":" -f1)
变量type_name
被分配了command substitution
的结果(例如echo $map_value_item | cut -d":" -f1
的结果)。