2012-05-13 16 views
8

Estoy escribiendo un script bash que (con suerte) redireccionará a un archivo cuyo nombre se genera dinámicamente, basado en el primer argumento dado al script, antes de la cadena. El nombre del script es ./buildcsvs.Redirigir la salida bash al nombre de archivo dinámico

Aquí es lo que el código es el ahora, sin los nombres de los archivos dinámicos

#!/bin/bash 
mdb-export 2011ROXBURY.mdb TEAM > team.csv 

es como me gustaría aquí a que salga

./buildcsvs roxbury 

debe ser la salida

roxburyteam.csv 

con "$ 1" como primer argumento del guión, donde el nombre del archivo está definido por algo así como algo como

"%steam" % $1 

¿Tiene alguna idea? Gracias

Respuesta

11

Simplemente concatene $ 1 con el "team.csv".

#!/bin/bash 
mdb-export 2011ROXBURY.mdb TEAM > "${1}team.csv" 

En el caso de que no puedan pasar un argumento al script, escribirá a "team.csv"

+1

eres un dios. ¡gracias! – mythander889

2

Se puede hacer referencia a un argumento posicional a través de un script de shell $1 o algo similar . Escribí el siguiente pequeño script de prueba para demostrar cómo se hace:

$ cat buildcsv 
#!/bin/bash 
echo foo > $1.csv 
$ ./buildcsv roxbury 
$ ./buildcsv sarnold 
$ ls -l roxbury.csv sarnold.csv 
-rw-rw-r-- 1 sarnold sarnold 4 May 12 17:32 roxbury.csv 
-rw-rw-r-- 1 sarnold sarnold 4 May 12 17:32 sarnold.csv 

intentar sustituir team.csv con $1.csv.

Tenga en cuenta que ejecutar el script sin un argumento creará un archivo vacío llamado .csv. Si desea manejar eso, tendrá que contar la cantidad de argumentos usando $#. Lo pirateé también:

$ cat buildcsv 
#!/bin/bash 
(($# != 1)) && echo Need an argument && exit 1 
echo foo > $1.csv 
+0

En bash, generalmente es mejor usar (()) para comparaciones numéricas. '(($ # < 1 || $# > 1)) && ...'. – jordanm

+0

@jordanm: buen punto, arreglado. Gracias. – sarnold

+1

'(($ #! = 1)) && ...' es más simple. –

Cuestiones relacionadas