scripts script programacion pasar parametros operaciones manejo ejemplos comandos cadenas aritmeticas linux bash parameters wildcard

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 ...