2012-03-28 14 views
13

¿Puedo crear un script Bash con valores variables persistentes?Variable en Bash Script que mantiene su valor desde la última vez que se ejecuta

Por ejemplo, inicializo una variable con 0 cuando el script se ejecuta por primera vez (durante un límite de tiempo específico), y la variable aumenta automáticamente cada vez que se ejecuta el script.

+0

/valor de la base de datos de escritura en la escritura del golpe; https://github.com/damphat/kv-bash :) – damphat

Respuesta

14

no se puede, pero se puede usar un archivo de hacerlo

#!/bin/sh 

# if we don't have a file, start at zero 
if [ ! -f "/tmp/value.dat" ] ; then 
    value=0 

# otherwise read the value from the file 
else 
    value=`cat /tmp/value.dat` 
fi 

# increment the value 
value=`expr ${value} + 1` 

# show it to the user 
echo "value: ${value}" 

# and save it for next time 
echo "${value}" > /tmp/value.dat 
3

Me temo que tiene que guardar el estado en un archivo en alguna parte. El truco es ponerlo en un lugar donde el usuario pueda escribir.

yourscriptvar=0 

if [ -e "$HOME/.yourscriptvar" ] ; then 
    yourscriptvar=$(cat "$HOME/.yourscriptvar") 
fi 

# do something in your script 

#save it output the file 
echo $yourscriptvar > "$HOME/.yourscriptvar" 
+1

Aquí hay un bash-ismo: 'yourscriptvar = $ (<" $ HOME/.yourscriptvar ")'. Documentado [aquí] (http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution) –

+0

Me gusta ... Pondré eso en mi bolsa de hacks de bash. gracias –

3

Yo tenía el mismo problema hace unos días y me ha escrito mi propia herramienta para hacer el trabajo porque no hay otra manera de hacer algo similar.

gvar es una tienda de valor-clave de Bash pura donde cada usuario tiene una colección de datos diferente. Los registros se almacenan en el directorio de inicio del usuario.

Aquí es las funciones más interesantes desde el código fuente:

clave
get_variable() { 
    cat $FILE | grep -w $1 | cut -d'=' -f2 
} 

set_variable() { 
    echo $1=$2 >> $FILE 
} 

remove_variable() { 
    sed -i.bak "/^$1=/d" $FILE 
} 
+0

Huh. Se podría pensar que para una 'biblioteca' de este tipo se optimizaría la velocidad. Por ejemplo, 'cat' es innecesario si usa' grep' ya que 'grep' ya puede tomar un archivo como argumento. Además, me pregunto cómo funcionaría esto en ejecución paralela si no usa 'bandada' o algo así. – Yeti

+0

@Yeti tienes toda la razón, gvar es solo un juguete que resolvió mi problema pero no he avanzado. Pensé cosas similares que usted señaló. Gracias. –

Cuestiones relacionadas