bashで引数をIFS==で文字列を分解する

July 30, 2021

  • whileへの情報の渡し方は cat hoge | while … より while read do ; … ; done < <( echo …) の方が良い。パイプだどパイブ以降はサブシェルとして扱われ、サブシェル内で変数を操作しても、サブシェルの外へは影響を及ぼせない。外の変数を操作できない。
  • IFS== で key=value を分解できる
  • eval local $key=$value の形で関数内だけで有効な変数とできる
create-tags(){
  INSTANCEID=$1 ; shift
  while read VAL ; do
    IFS== read create_tags_key create_tags_value <<<"$VAL"
    if [[ "x" = "x${create_tags_key}" ]] || [[ "x" = "x${create_tags_value}" ]] ; then
      echo -e "$0 ${FUNCNAME[0]} です。\n 第2引数以降は key=value の形式でお願いします"
      echo " key=value が ${create_tags_key}=${create_tags_value} でした"
      exit 4
    fi
    eval local ${create_tags_key}=${create_tags_value}
    TAGS="$TAGS Key=${create_tags_key},Value=${create_tags_value}"
  done < <( echo $@ | sed -e 's/ +/ /g' -e 's/ /\n/g' )
  TAGS="$TAGS Key=Creater,Value=${USER}@${HOSTNAME}"

  echo -e "$0 ${FUNCNAME[0]} $KEY $VALUE $moemoe $hogehoge"
  echo $TAGS
  # aws ec2 create-tags --tags Key=Name,Value=${NAME} Key=Nodes,Value=${NODES} Key=Roles,Value=${ROLES} Key=Creater,Value="$USER@$HOSTNAME" --resources ${INSTANCEID}
}
create-tags i-02d848a7 Name=inoue-test1 Nodes=default  ROLES=ekitan_essence hogehoge=4

Profile picture

Written by tin-machine 技術関連のメモ Twitter