Como criar um diretório combinando dois nomes?

2

Estou no Redhat.

Estou tentando criar um diretório combinando três nomes.

Eu tenho um arquivo de propriedades, é assim:

build_name = MyBuild
build_no   = 100
appServer_version = jboss6.1'

Eu li esse arquivo de propriedades e estou tentando criar um diretório combinando todos os três nomes. Depois de criar o diretório, ele deve ficar assim.

MYBuild-100-jboss6.1

Aqui o que tentei

file="./app.properties"

if [ -f "$file" ]
then
  echo "$file found."

  while IFS='=' read -r key value
  do
    key=$(echo $key | tr '.' '_')
    eval "${key}='${value}'"
  done < "$file"

    echo "build_name    = " ${build_name}
    echo "build_no      = " ${build_no}
    echo "Jboss_version     = "${jboss_version}
    echo "Got the value from property file"


 name=${build_name}-
 build=${build_no}-
 Jboss=${jboss_version}

 fileName="${name}${build}${Jboss}"

    mkdir $fileName

else
  echo "$file not found."
fi

Quando eu executo isso, ele sempre cria três diretórios diferentes, com o nome MyBuild , 100 , jboss6.1 . Onde estou fazendo errado.

atualização 1

file="./app.properties"

ARRAY=()
if [ -f "$file" ]
then
  echo "$file found."

  IFS='='
  while read -r key value
  do
    val=$(echo "$value" | tr -d '[[:space:]]')
    ARRAY+=("$val")
  done < "$file"

  IFS='-'
  newdir="${ARRAY[*]}"
  echo "mkdir $newdir"

    if[ -f "$newdir" ]
    then 
    echo "$newdir allready exist."
    rm -rf $newdir
    mkdir "$newdir"
    else
    mkdir "$newdir"
else
  echo "$file not found."
fi
    
por Varun 13.08.2016 / 21:38

3 respostas

2

Você tem dois problemas lá, primeiro são os espaços que são deixados em suas variáveis quando você executa o read com IFS='=' . Em segundo lugar, você não tem jboss_version no seu arquivo de aplicativo. Uma maneira de fazer isso seria:

file="./app.properties"

if [ -f "$file" ]
then
  echo "$file found."

  while IFS='=' read -r key value
  do
    key=$(echo $key | tr '.' '_' | tr -d ' ' | tr -d '\t')
    val=$(echo $value | tr -d ' ' | tr -d '\t')
    eval "${key}='${val}'"
  done < "$file"

    echo "build_name    = " ${build_name}
    echo "build_no      = " ${build_no}
    echo "Jboss_version     = "${appServer_version}
    echo "Got the value from property file"


 name=${build_name}-
 build=${build_no}-
 Jboss=${appServer_version}

 fileName="${name}${build}${Jboss}"

    echo mkdir [$fileName]

else
  echo "$file not found."
fi

No entanto, eu faria isso de uma maneira diferente. Forçando IFS para ser usado na divisão e na associação também, isso também usa todas as variáveis do arquivo app.properties :

file="./app.properties"

ARRAY=()
if [ -f "$file" ]
then
  echo "$file found."

  IFS='='
  while read -r key value
  do
    val=$(echo "$value" | tr -d '[[:space:]]')
    ARRAY+=("$val")
  done < "$file"

  IFS='-'
  newdir="${ARRAY[*]}"
  if [ -d "$newdir" ]; then
      echo "rm -rf $newdir"
      rm -rf "$newdir"
  fi
  echo "mkdir $newdir"
  mkdir "$newdir"
else
  echo "$file not found."
fi
    
por 13.08.2016 / 22:25
1

Existem vários problemas com o seu script, sem reescrever completamente você precisa:

  • tira value de qualquer espaço
  • use appServer_version no seu script, como no arquivo de entrada não JbossVersion

Trabalhando:

file="./app.properties"

if [ -f "$file" ]
then
  echo "$file found."

  while IFS='=' read -r key value
  do
    key=$(echo $key | tr '.' '_')
    value=$(echo $value | sed 's/ //g')
    eval "${key}='${value}'"
  done < "$file"

  echo "build_name    = " ${build_name}
  echo "build_no      = " ${build_no}
  echo "Jboss_version     = "${appServer_version}
  echo "Got the value from property file"


  name=${build_name}-
  build=${build_no}-
  Jboss=${appServer_version}

  fileName="${name}${build}${Jboss}"
  echo $fileName
  # mkdir $fileName

else
  echo "$file not found."
fi
    
por 13.08.2016 / 22:24
0

para pular #comentários ou algum lixo no app.properties     #! / bin / bash

FILE="./app.properties"

SEP=
FILENAME=
while read -r LINE; do 
     LINE=$(echo ${LINE} | sed -rn -e  '/=/{/#.*/d;s/[^=]+=([^=]+).*//;s/[ ]*//gp}' )
     [[ -n ${LINE} ]] && FILENAME+=${SEP}${LINE} && [[ -z ${SEP} ]] && SEP="-" 
done <"$FILE"

echo $FILENAME
#mkdir $FILENAME
    
por 14.08.2016 / 00:17