2012-08-21 12 views
5

Esto puede que ya esté respondido, pero lo voy a preguntar de todos modos. Tengo dos versiones de un guión (comp.sh) -"[]" vs. "[[]]" en el shell Bash

#!/bin/sh 
export tDay=$(date '+%Y%m%d') 
newfile="filename_$tDay" 
filename="filename_20120821100002.csv" 
echo $newfile $filename 
if [ $filename = *$newfile* ] 
then 
    echo "Matched" 
else 
    echo "Not Matched!" 
fi 

Output: 
$ ./comp.sh 
filename_20120821 filename_20120821100002.csv 
Not Matched! 

Y

#!/bin/sh 
export tDay=$(date '+%Y%m%d') 
newfile="filename_$tDay" 
filename="filename_20120821100002.csv" 
echo $newfile $filename 
if [[ $filename = *$newfile* ]] 
then 
    echo "Matched" 
else 
    echo "Not Matched!" 
fi 

$ comp.sh 
filename_20120821 filename_20120821100002.csv 
Matched 

Podría alguien explicar por qué la diferencia?

Además, ¿en qué circunstancias se debe utilizar [ ] en comparación con [[ ]] y viceversa?

+5

Esta pregunta es similar y tiene una buena respuesta que apunta a una gran documentación: http://stackoverflow.com/questions/669452/is-preferable-over-in-bash-scripts – malvim

Respuesta

4

test operador de igualdad de cadenas no hace globs.

$ [ abc = *bc ] ; echo $? 
1 
$ [[ abc = *bc ]] ; echo $? 
0 
+1

Puedo ver eso. Pero, ¿por qué? ¿Pueden explicar por qué '[]' vs. '[[]]' marca la diferencia? – Annjawn

+1

No, no puedo. Hay muchas cosas que la mayoría de la gente no sabe, simplemente porque el proceso de toma de decisiones que provocó esas cosas era opaco. –

+0

Ok, ¿entonces '[]' aparentemente fue (es) un programa 'prueba'? – Annjawn

2

Also - under what circumstances should [ ] be used vs. [[ ]] and vice versa?

Depende. Si le preocupa la portabilidad y desea que sus scripts de shell se ejecuten en una variedad de shells, entonces nunca debe usar [[. Si desea las funciones provistas por [[ en algunos shells, debe usar [[ cuando desee esas características. Personalmente, nunca uso [[ porque la portabilidad es importante para mí.

+0

Pero digamos que no quiero usar '[[]]' pero también quiero hacer una comparación de subcadenas como en mi código anterior, ¿cómo lo hice? – Annjawn

+0

¿Está buscando 'if echo" $ nombre de archivo "| grep -qF "$ newfile"; entonces ... '? –

+0

algo así pero sin 'grep'. Entonces, si lo entiendo, esta es la única manera de hacer que mi código sea compatible en múltiples tipos de shell y evitar el uso de '[['. – Annjawn

12

[[ es un bash incorporado, y no se puede utilizar en un script #!/bin/sh. Querrá leer la sección Conditional Commands del manual de bash para conocer las capacidades de [[. Los principales beneficios que vienen a la mente:

  • == y != realizar la coincidencia de patrones, por lo que el lado derecho puede ser un patrón global
  • =~ y !~ realizar comparaciones de expresiones regulares. Los grupos capturados se almacenan en la matriz BASH_REMATCH.
  • operadores booleanos && y ||
  • sin división de palabras, por lo que no es estrictamente necesario citar sus variables.

El principal inconveniente: su secuencia de comandos ahora es específica de bash.

Cuestiones relacionadas