script menú hacer example como bash shell printf

bash - menú - SPRINTF en shell scripting?



menú en shell script de linux (3)

Tengo un archivo generado automáticamente cada día que recibe un script de shell. Pero, el problema que estoy enfrentando es que el archivo generado automáticamente tiene una forma de:

FILE_MM_DD.dat

... donde MM y DD son cadenas de 2 dígitos para el mes y el día del mes.

Investigué un poco y me di cuenta por mi cuenta, pero no sé cómo crear estas cadenas personalizadas usando solo scripts de shell.

Para ser claro, conozco la función DATE en Bash, pero lo que estoy buscando es el equivalente de la función SPRINTF en C.


¿Por qué no usar el programa printf de coreutils?

$ printf "FILE_%02d_%02d.dat" 1 2 FILE_01_02.dat


En Bash:

var=$(printf ''FILE=_%s_%s.dat'' "$val1" "$val2")

o, el equivalente, y más cerca de sprintf :

printf -v var ''FILE=_%s_%s.dat'' "$val1" "$val2"

Si sus variables contienen valores decimales con ceros a la izquierda, puede eliminar los ceros a la izquierda:

val1=008; val2=02 var=$(printf ''FILE=_%d_%d.dat'' $((10#$val1)) $((10#$val2)))

o

printf -v var ''FILE=_%d_%d.dat'' $((10#$val1)) $((10#$val2))

El $((10#$val1)) coacciona el valor en la base 10 por lo que el %d en la especificación de formato no cree que "08" sea un valor octal no válido.

Si usa la date (al menos para la date GNU), puede omitir los ceros a la izquierda de esta manera:

date ''+FILE_%-m_%-d.dat''

Para completar, si desea agregar ceros a la izquierda, acolchados a un cierto ancho:

val1=8; val2=2 printf -v var ''FILE=_%04d_%06d.dat'' "$val1" "$val2"

o con anchos dinámicos:

val1=8; val2=2 width1=4; width2=6 printf -v var ''FILE=_%0*d_%0*d.dat'' "$width1" "$val1" "$width2" "$val2"

Agregar ceros a la izquierda es útil para crear valores que se ordenan fácilmente y se alinean ordenadamente en columnas.


Tratar:

sprintf() { local stdin; read -d '''' -u 0 stdin; printf "$@" "$stdin"; }

Ejemplo:

$ echo bar | sprintf "foo %s" foo bar