controla um script bash com variáveis de um arquivo externo

5

Eu gostaria de controlar um script bash como este:

#!/bin/sh
USER1=_parsefromfile_
HOST1=_parsefromfile_
PW1=_parsefromfile_
USER2=_parsefromfile_
HOST2=_parsefromfile_
PW2=_parsefromfile_

imapsync \
--buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --IgnoreSizeErrors \
--host1 $HOST1 --user1 $USER1 --password1 $PW1 --ssl1 --port1 993 --noauthmd5 \
--host2 $HOST2 --user2 $USER2 --password2 $PW2 --ssl2 --port2 993 --noauthmd5 --allowsizemismatch

com parâmetros de um arquivo de controle como este:

host1 user1 password1 host2 user2 password2
anotherhost1 anotheruser1 anotherpassword1 anotherhost2 anotheruser2 anotherpassword2 

em que cada linha representa uma execução do script com os parâmetros extraídos e transformados em variáveis.

qual seria a maneira mais elegante de fazer isso?

PAT

    
por perler 06.01.2011 / 09:32

4 respostas

7

Com scripts de shell, isso normalmente é feito usando a função source , que executa o arquivo como um script de shell como se estivesse embutido no script que você está executando - o que significa que quaisquer variáveis definidas no arquivo são exportados para o seu script.

A desvantagem é que (a) seu arquivo de configuração é executado, portanto, é um risco de segurança se usuários sem privilégios puderem editar arquivos de configuração privilegiados. E (b) sua sintaxe de arquivo de configuração é restrita à sintaxe bash válida. Ainda assim, é realmente conveniente.

config.conf

USER=joe
PASS=hello
SERVER=127.0.0.2

script.sh

#!/bin/bash

# Set defaults   
USER='whoami'

# Load config values
source config.conf

foobar2000 --user=$USER --pass=$PASS --HOST=$HOST

source pode ser abreviado com um único . - então os dois seguintes são equivalentes:

 source file.sh
 . file.sh
    
por 06.01.2011 / 09:49
3

Algo parecido com isto. O bit importante é usar leia para obter uma linha como uma matriz.

#!/bin/bash
configfile=/pathtocontrolfile
cat $configfile | while read -a HR ; do

  [[ -z ${HR[0]} ]] && continue  # skip empty lines

  USER1=${HR[0]}
  HOST1=${HR[1]}
  PW1=${HR[2]}
  USER2=${HR[3]}
  HOST2=${HR[4]}
  PW2=${HR[5]}

  imapsync \
  --buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --IgnoreSizeErrors \
  --host1 $HOST1 --user1 $USER1 --password1 $PW1 --ssl1 --port1 993 --noauthmd5 \
  --host2 $HOST2 --user2 $USER2 --password2 $PW2 --ssl2 --port2 993 --noauthmd5 --allowsizemismatch

done
    
por 06.01.2011 / 09:48
0

Eu acho que você deveria estar usando algo como getopts se quiser tornar seu script inteligente, em vez de apenas tentar ler seus argumentos com base no número.

Algo parecido com isto.

#!/bin/bash

while getopts ":a" opt; do
  case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done


$ ./go_test.sh -a
-a was triggered!
$ 

Você pode analisar argumentos também. Você pode ler mais detalhes sobre o tutorial em aqui .

    
por 07.01.2013 / 11:07
0

Encontrei a solução de trabalho aqui: link

if [ -f "$SETTINGS_FILE" ];then
    . "$SETTINGS_FILE"
fi
    
por 24.01.2016 / 16:32