script - programacion shell linux ejemplos
¿Cómo paso un parámetro comodín a un archivo bash? (2)
Estoy tratando de escribir un script de bash que le permita al usuario pasar una ruta de directorio usando comodines.
Por ejemplo,
bash show_files.sh *
cuando se ejecuta dentro de este directorio
drw-r--r-- 2 root root 4.0K Sep 18 11:33 dir_a
-rw-r--r-- 1 root root 223 Sep 18 11:33 file_b.txt
-rw-rw-r-- 1 root root 106 Oct 18 15:48 file_c.sql
saldría:
dir_a
file_b.txt
file_c.sql
La forma en que está ahora, produce:
dir_a
contenido de show_files.sh
:
#!/bin/bash
dirs="$1"
for dir in $dirs
do
echo $dir
done
Cita el comodín:
bash show_files.sh ''*''
o haga que su script acepte una lista de argumentos, no solo uno:
for dir in "$@"
do
echo "$dir"
done
Es mejor iterar directamente sobre "$@''
lugar de asignarlo a otra variable, a fin de preservar su capacidad especial para contener elementos que a su vez contienen espacios en blanco.
El shell primario, el que invoca a bash show_files.sh *
, expande el *
para usted.
En tu script, necesitas usar:
for dir in "$@"
do
echo "$dir"
done
Las comillas dobles aseguran que los espacios múltiples, etc. en los nombres de archivos se manejen correctamente.
Vea también Cómo iterar sobre argumentos en un script de shell . bash
Addendum potencialmente confuso
Si está realmente seguro de que desea obtener la secuencia de comandos para expandir el *
, debe asegurarse de que *
se pasa a la secuencia de comandos (entre comillas, como en las otras respuestas), y luego asegurarse de que se expanda en la Punto correcto en el procesamiento (que no es trivial). En ese punto, usaría una matriz.
names=( $@ )
for file in "${names[@]}"
do
echo "$file"
done
No uso a menudo $@
sin las comillas dobles, pero esta es una vez en la que es más o menos lo correcto. La parte difícil es que no manejará comodines con espacios muy bien.
Considerar:
$ > "double space.c"
$ > "double space.h"
$ echo double/ / space.?
double space.c double space.h
$
Eso funciona bien. Pero intente pasar eso como comodín al guión y ... bueno, digamos que puede ser complicado en ese punto.
Si desea extraer $2
separado, puede utilizar:
names=( $1 )
for file in "${names[@]}"
do
echo "$file"
done
# ... use $2 ...