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 -ses una extensión no estándar: editaré mi respuesta para usar la sintaxis estándar.shopt -s nullglobantes del bucle (yshopt -u nullglobdespués para evitar problemas más adelante), o agregueif [[ ! -e "$filename ]]; then continue; fial 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 nullglobestá! (oshopt failglobpuede usarse también, según el comportamiento que desee).dir.txtLa
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-rcambio 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"; doneParece 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-rinterruptor 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