不要理解这个bash脚本中的某些命令

时间:2015-03-19 21:50:39

标签: bash unix

我的任务是修改这个bash脚本,这个脚本中有一些我不太明白的语法。

在研究和研究一些bash之后,我理解了大多数人。关于在这里发布整个脚本我感觉很糟糕,但我不想隐藏任何可能使我更难回答问题的信息。

基本上我在理解以下脚本中可以找到的以下bash命令方面存在差距。

  1. if [[ ${#} -eq 3 ]]; then - 这里的$#是什么?什么是[[]]
  2. eval HOSTNAME_PORT=\$$ENV eval config_mapping_values=\$$MAPPING - 这里有2美元?怎么了斜线
  3. IFS=',' read -a mapping_value_array <<< "$mapping_values_param"
  4. "${!mapping_value_array[@]}" - 循环开始时@符号是什么?
  5. type_name=$(echo $map_value_item | cut -d":" -f1) - 为什么在括号的外部和内部使用$符号?
  6. 完整的脚本:

    #!/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
    

1 个答案:

答案 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的结果)。