Lo que has escrito en realidad casi funciona (funcionaría si todas las variables fueran números), pero no es una forma idiomática en absoluto.
(…)
los paréntesis indican una subshell . Lo que hay dentro de ellos no es una expresión como en muchos otros idiomas. Es una lista de comandos (al igual que los paréntesis externos). Estos comandos se ejecutan en un subproceso separado, por lo que cualquier redirección, asignación, etc. realizada dentro de los paréntesis no tiene efecto fuera de los paréntesis.
- Con un signo de dólar inicial,
$(…)
es una sustitución de comando : hay un comando dentro de los paréntesis, y la salida del comando se usa como parte de la línea de comando (después de expansiones adicionales a menos que la sustitución sea entre comillas dobles, pero esa es otra historia ) .
{ … }
Las llaves son como paréntesis en el sentido de que agrupan comandos, pero solo influyen en el análisis, no en la agrupación. El programa x=2; { x=4; }; echo $x
imprime 4, mientras que x=2; (x=4); echo $x
imprime 2. (También las llaves requieren espacios a su alrededor y un punto y coma antes del cierre, mientras que los paréntesis no. Eso es solo una peculiaridad de sintaxis).
- Con un signo de dólar principal,
${VAR}
es una expansión de parámetros , que se expande al valor de una variable, con posibles transformaciones adicionales.
((…))
los paréntesis dobles rodean una instrucción aritmética , es decir, un cálculo en enteros, con una sintaxis similar a otros lenguajes de programación. Esta sintaxis se usa principalmente para asignaciones y en condicionales.
- La misma sintaxis se usa en expresiones aritméticas
$((…))
, que se expanden al valor entero de la expresión.
[[ … ]]
los corchetes dobles rodean las expresiones condicionales . Las expresiones condicionales se basan principalmente en operadores como -n $variable
para probar si una variable está vacía y -e $file
para probar si existe un archivo. También hay operadores de igualdad de cadenas: "$string1" == "$string2"
(tenga en cuenta que el lado derecho es un patrón, por ejemplo, [[ $foo == a* ]]
prueba si $foo
comienza con a
mientras que las [[ $foo == "a*" ]]
pruebas $foo
son exactas a*
), y lo familiar !
, &&
y ||
operadores para negación, conjunción y disyunción, así como paréntesis para la agrupación. Tenga en cuenta que necesita un espacio alrededor de cada operador (por ejemplo [[ "$x" == "$y" ]]
, no [[ "$x"=="$y" ]]
), y un espacio o un carácter como ;
dentro y fuera de los corchetes (por ejemplo [[ -n $foo ]]
, no[[-n $foo]]
)
[ … ]
los corchetes simples son una forma alternativa de expresiones condicionales con más peculiaridades (pero más antiguas y portátiles). No escribas ninguno por ahora; empiece a preocuparse por ellos cuando encuentre scripts que los contengan.
Esta es la forma idiomática de escribir su prueba en bash:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Si necesita portabilidad a otros shells, este sería el camino (tenga en cuenta las citas adicionales y los conjuntos de corchetes separados alrededor de cada prueba individual, y el uso del =
operador tradicional en lugar de la ==
variante ksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then