Use un parámetro en un argumento de command

Ejecuto un command find para search files con un nombre que contenga perl :

 find /tmp -name '*perl*' /tmp/perl.pl /tmp/run-perl-stage.pl 

Pero cuando configuro el nombre perl en un PARAMETER variable y ejecuto nuevamente el command find , ¡no obtengo ningún resultado! ¿Cómo ejecutar el command find con $PARAMETER ?

 PARAMETER=perl find /tmp -name '*$PARAMETER*' 

no obtiene ningún resultado

 find /tmp -name '*\$PARAMETER*' 

no obtiene ningún resultado

Debe usar comillas dobles, no comillas simples.

Dentro de comillas simples '…' , cada personaje se interpreta literalmente. El único carácter que se trata especialmente es el carácter de comilla simple, que termina la cadena literal.

Dentro de comillas dobles "…" , los siguientes caracteres son tratados especialmente:

  • " (comillas dobles) termina la cadena entre comillas.
  • $ (dólar) se expande. Puede iniciar una sustitución de variable o una sustitución de command o una expresión aritmética: "$PARAMETER" , "${PARAMETER}" , "${PARAMETER%/*}" , "$(somecommand)" , $((x+2)) , etc.
  • ` (backquote) se expande. Es una forma alternativa de sustitución de command que es difícil de usar cuando tienes caracteres especiales en el command nested: `foo` es como $(foo) pero más complicado para getlo en casos complejos.
  • En conchas interactivas,! puede desencadenar la expansión de la historia
  • \ (barra invertida) cita el siguiente carácter, pero solo si es uno de los caracteres en esta list: con otros caracteres, la barra invertida permanece. Por ejemplo, "foo\$\bar" es equivalente a 'foo$\bar' . Como exception, se ignora una secuencia de barra invertida-línea nueva: la barra inversa come el siguiente carácter de línea nueva.

Una consecuencia de esto es que no puede tener una sola comilla dentro de una cadena de una sola cita. Para solucionarlo, puede unir partes entre sí: echo 'Here'\''sa string with a single quote' pasa un argumento a echo que se expresa en tres partes, dos cadenas de comillas simples con \' (expandiéndose a una sola comilla simple) en el medio.

Como quiera que suceda la sustitución de variables, use comillas dobles:

 find /tmp -name "*$PARAMETER*" 

Por cierto, hay una diferencia entre "$PARAMETER" y $PARAMETER . Con comillas dobles, el shell busca el valor de PARAMETER y expande esa cadena en la línea de command. Sin comillas, el valor de PARAMETER se interpreta como una list de patrones comodín separados por espacios en blanco. Esto casi nunca es deseable, así que siempre ponga comillas dobles alnetworkingedor de las sustituciones de variables y commands.

Primero, nunca use la variable mayúscula en bash, puede entrar en conflicto con las variables existentes del sistema.

En segundo lugar, para su problema, puede hacerlo así (si aún desea una comilla simple, en lugar de una doble),

 param='*perl*' find /tmp/ -name $param