5 votos

control de un script en bash con las variables de un archivo externo

Me gustaría control de un bash script 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

con los parámetros de un archivo de control como este:

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

donde cada línea representa una ejecución de la secuencia de comandos con los parámetros extraídos y se han convertido en variables.

¿cuál sería la forma más elegante de hacer esto?

PAT

7voto

tylerl Puntos 8195

Con los scripts de shell, normalmente esto se logra usando el source de función, el cual ejecuta el archivo como una secuencia de comandos de shell como si estuviera en línea en el script que se está ejecutando, lo que significa que ninguna de las variables que se establezca en el archivo exportado en la secuencia de comandos.

La desventaja es que (a) el archivo de configuración se ejecuta, por lo que es un riesgo de seguridad si los usuarios sin privilegios puede editar privilegiado de archivos de configuración. Y (b) el archivo de configuración de la sintaxis se limita a validar la sintaxis de bash. Aún así, es 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 puede ser abreviado con una sola . - para que los dos siguientes son equivalentes:

 source file.sh
 . file.sh

3voto

Zoredache Puntos 84524

Algo como esto. El más importante es el uso de lectura de agarrar una línea de una 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

0voto

GeekRide Puntos 2615

Creo que debe ser el uso de algo como getopts si usted desea hacer su guión inteligente, en lugar de tratando de leer sus argumentos en el número base.

Algo como esto.

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

Usted puede analizar los argumentos también. Usted puede leer más detalles sobre el tutorial más de aquí.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: