¿Cómo grep el argumento de línea de command en el que se ha aplicado RegEx?

Intento escribir un script que tome como input un set de integers que representan ciertos /dev/sda . Por ejemplo, si los arguments de la línea de command son 3 y 5, la salida mostrará el UUID para /dev/sda3 y /dev/sda5 . Mi código es:

 #!/bin/bash ### Shows UUID of input /dev's - REQUIRES SUDO ## Options: ## [-m] Multiple Devs - returns both dev name and UUID ## [ ] No option - returns only the UUID of the dev. while getopts m: option do case "${option}" in m) echo -e "\nDEV\tUUID\n====\t================" blkid | grep .*sda[\"$@\"] | sed -r 's/\/dev\/([[:alnum:]]+).* UUID="([[:alnum:]]+)".*/\1\t\2/g' ;; esac done 

Mi problema principal es con la línea grep .*sda[\"$@\"] que devuelve el siguiente error:

$ sudo ./dUShow.sh -m 3 5

 DEV UUID ==== ================ grep: Unmatched [ or [^ 

Ahora bien, si no me equivoco, esto significa que el problema se produce cuando bash proporcionar opciones alternativas *.sda[$@] que deseo que RegEx sobrescriba con *.sda[$1$2] , equivalente a *.sda[35] para la input dada.

¿Cómo hago esto?

Entrada de muestra

 sudo ./dUShow.sh -m 3 5 

Salida deseada

 DEV UUID ==== ================ sda3 BC4208CF42089076 sda5 968E185A8E183569 

Apéndice

¿La expresión .*sda[\"$@\"] va a producir *.sda[35] o *.sda[3 5] ? Si es el último, ¿causará un problema? Si es así, ¿cómo lo resuelvo?

Si $ 1 == 3 y $ 2 == 5, entonces

 grep .*sda[\"$@\"] 

se convierte en

 grep .*sda[3 5] 

Lo cual es un problema debido a la falta de comillas. Pruebe esto en su lugar:

 regex=".*sda($( IFS='|'; echo "$*" ))\\>" # => .*sda(3|5)\> blkid | grep -E "$regex" | ... 

El \> es un límite de palabras, para hacer que la expresión regular sea más precisa.


Alguna documentation sobre los sabores de expresión regular grep de GNU:

  1. expresiones regulares básicas
  2. expresiones regulares extendidas

Para las coincidencias de un solo dígito, puede colocar la cadena del argumento directamente en los corchetes RE. (Creo que esto es lo que originalmente intentabas hacer).

 grep "/dev/sda[$*]:" 

Tenga en count que $* includeá un carácter de espacio entre los arguments de dígitos (por ejemplo, 2 y 5 resultarán en $* con el valor citado 2 5 ), pero como podemos garantizar que /dev/sda : nunca coincidirá, no lo hace importa en esta situación.

Para simplificar la línea de command, puede dispensar completamente el grep , así:

 blkid | sed -rn "s#/dev/(sda[$*]):"'.* UUID="([[:alnum:]]+)".*#\1\t\2#p'