Necesito escribir un script que inicie mi programa con diferentes argumentos, pero soy nuevo en Bash. Comienzo mi programa con:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
Aquí está el pseudocódigo de lo que quiero hacer:
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
Así que estoy realmente intrigado sobre cómo crear un segundo argumento a partir del primero, por lo que parece dataABCD_Log1.txt e iniciar mi programa.
basename -s
es una extensión no estándar: editaré mi respuesta para usar la sintaxis estándar.shopt -s nullglob
antes del bucle (yshopt -u nullglob
después para evitar problemas más adelante), o agregueif [[ ! -e "$filename ]]; then continue; fi
al principio del bucle, para omitir los archivos inexistentes.Perdón por el nigromancio del hilo, pero cada vez que itera sobre los archivos con glob, es una buena práctica evitar el caso de la esquina donde el glob no coincide (lo que hace que la variable de bucle se expanda a la cadena del patrón de glob (no coincidente)).
Por ejemplo:
Referencia: trampas Bash
fuente
shopt nullglob
está! (oshopt failglob
puede usarse también, según el comportamiento que desee).dir.txt
La
name=${file##*/}
sustitución ( expansión del parámetro de shell ) elimina el nombre de ruta principal hasta el último/
.La
base=${name%.txt}
sustitución elimina el final.txt
. Es un poco más complicado si las extensiones pueden variar.fuente
base=${name%.txt}
, en lugar debase=${base%.txt}
.Puede usar la opción de resultados de búsqueda separada por nulo con lectura para iterar sobre las estructuras de directorio de forma segura.
Entonces para tu caso
Adicionalmente
ejecutará el ciclo while en el alcance actual del script (proceso) y permitirá que la salida de find se use para establecer variables si es necesario
fuente
$'\0'
Es una forma extraña de escribir''
. Que se está perdiendoIFS=
y el-r
cambio aread
: su estado de lectura debe ser:IFS= read -rd '' file
.$'\0'
y distribuir algunos puntos de pila. Voy a hacer las ediciones que señaló. ¿Cuáles son los efectos nocivos de noIFS=
intentarlo?echo -e "ok \nok\0" | while read -d '' line; do echo -e "$line"; done
Parece que no hay ninguno. Además, -r veo que a menudo es predeterminado, pero no pude encontrar un ejemplo de lo que impide que suceda.IFS=
es necesario en caso de que un nombre de archivo termine con un espacio: try is withtouch 'Prospero '
(tenga en cuenta el espacio final). También necesita el-r
interruptor en caso de que un nombre de archivo tenga una barra invertida: pruébelo contouch 'Prospero\n'
.Parece que estás intentando ejecutar un archivo de Windows (.exe). Seguramente deberías estar usando powershell. De todos modos, en un bash shell de Linux, bastará con una línea simple.
O en una fiesta
fuente