Saltar al contenido

¿Cómo asignar una expresión global a una variable en un script Bash?

Solución:

Creo que es el orden de las expansiones:

El orden de las expansiones es: brace
expansion
, expansión de tilde, parámetro,
variable y expansión aritmética y sustitución de comandos (hecho de izquierda a derecha), división de palabras y pathname expansion.

Entonces, si se sustituye su variable, la expansión de llaves ya no se lleva a cabo. Esto funciona para mi:

eval ls $dirs

Tenga mucho cuidado con eval. Ejecutará las cosas textualmente. Entonces, si dirs contiene f{m,k}t*; some_command, some_command se ejecutará después de que ls termine. Ejecutará la cadena que le des a eval en el shell actual. Pasara /content/dev01 /content/dev02 a ls, existan o no. Poniendo * después de que las cosas lo conviertan en una expansión de nombre de ruta, y omitirá las rutas no existentes:

dirs=/content/{dev01,dev02}*

No estoy 100% seguro de esto, pero tiene sentido para mí.

Aquí hay una excelente discusión de lo que está tratando de hacer.

La respuesta corta es que quieres una matriz:

dirs=(/content/{dev01,dev01})

Pero lo que haces con los resultados puede volverse más complejo de lo que pretendías, creo.

Esto no es un globbing de nombre de archivo, es una expansión de llaves. La diferencia es sutil, pero existe: en el globbing de nombre de archivo, solo recibiría archivos existentes como resultado, mientras que en la expansión de llaves puede generar cualquier tipo de cadena.

http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion

http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion

Ahora, esto es lo que funcionó para mí:

#!/bin/sh
dirs=`echo ./{dev01,dev02}`
ls $dirs
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *