Lista de ‘if’ muda em qualquer lugar?

Existe uma lista de todos os switches if para uso no script bash? Às vezes eu vejo alguém usando isso e me pergunto o que o switch que eles estão usando realmente faz.

Exemplo é o -z neste. Eu sei como usá-lo, mas não sei de onde foi derivado.

 if [ -z "$BASH_VERSION" ]; then echo -e "Error: this script requires the BASH shell!" exit 1 fi 

Quaisquer referências, guias, posts, respostas seriam apreciadas.

Olhe para o bash manpage ( man bash ). As opções estão especificadas na seção CONDITIONAL EXPRESSIONS :

 CONDITIONAL EXPRESSIONS Conditional expressions are used by the [[ compound command and the test and [ builtin commands to test file attributes and perform string and arithmetic comparisons. Expressions are formed from the following unary or binary primaries. If any file argument to one of the pri- maries is of the form /dev/fd/n, then file descriptor n is checked. If the file argument to one of the primaries is one of /dev/stdin, /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively, is checked. Unless otherwise specified, primaries that operate on files follow sym- bolic links and operate on the target of the link, rather than the link itself. -a file True if file exists. ... more options ... 

Também é explicado na ajuda:

 $ help [ [: [ arg... ] This is a synonym for the "test" builtin, but the last argument must be a literal `]', to match the opening `['. 

Sim. Elas são chamadas de expressões condicionais e são usadas pelo comando [[ compound command e o comando test e [ builtin] ( [ é simplesmente um sinônimo para test ).

Leia a seção 6.4 Expressões Condicionais Baseadas no Manual de Referência do Bash , que contém uma lista de todos esses switches e seu uso.

Eles não são opções para a instrução if , mas para o comando test ( [ é um sinônimo para o test embutido). Veja o help test no bash para uma lista completa.

Na verdade, não é isso que está fornecendo isso – é [ mais conhecido pelo nome do test . help test deve fornecer uma lista de todas as opções possíveis. Você também pode olhar para o padrão , se você se importa.

Os colchetes simples ( [ ... ] ) é um sinônimo do comando de test . Se você olhar a manpage para o teste , você verá quase todos (BASH pode ter alguns extras não mencionados aqui) dos vários switches se você os chamar. Tudo em um fácil de encontrar lugar.

Se você usar colchetes duplos ( [[ ... ]] ), você está usando um conjunto de testes BASH estendido. Isso tem a ver principalmente com a correspondência de expressões regulares e a correspondência de glob (e a correspondência de globos estendida se você tiver esse conjunto também). Para isso, você terá que ler a manchage BASH.

Você os chamou se interruptores , mas isso não é realmente correto. Estes são testes e realmente não têm nada a ver com o comando if .

O comando if apenas executa o comando fornecido e, se esse comando retornar um código de saída 0 , executará a parte if instrução if . Caso contrário, ele executará a parte else (se estiver presente).

Vamos dar uma olhada nisso:

 $ rm foo.test.txt # Hope this wasn't an important file $ if ls foo.test.txt > then > echo "This file exists" > else > echo "I can't find it anywhere.." > fi ls: foo.test.txt: No such file or directory I can't find it anywhere.. 

A instrução if executa o comando ls foo.test.txt e o comando ls retorna um valor diferente de zero porque o arquivo não existe. Isso faz com que a instrução if execute a cláusula else .

Vamos tentar de novo …

 $ touch foo.test.txt # Now this file exists. $ if ls foo.test.txt # Same "if/else" statement as above > then > echo "This file exists" > else > echo "I can't find it anywhere.." > fi foo.test.txt This file exists 

Aqui, o comando ls retornou um status de saída 0 (já que o arquivo existe e o arquivo existe e pode ser stat’ed pelo comando ls .

Normalmente, você não deve usar o comando ls para testar um arquivo. Simplesmente usei-o aqui para mostrar que a instrução if executa o comando e, em seguida, executa a cláusula if ou else dependendo do status de saída desse comando. Se você quiser testar se existe ou não um arquivo, use o comando test -e vez do comando ls :

 if test -e foo.test.txt # Same as above, but using "test" instead of "ls" then echo "This file exists" else echo "I can't find it anywhere.." fi 

Se o arquivo existir, test -e retornará um status de saída igual a 0 . Caso contrário, retornará um status de saída diferente de zero.

Se você fizer isto:

 $ ls -i /bin/test /bin/[ 10958 /bin/[ 10958 /bin/test 

Esse 10958 é o inode . Arquivos com o mesmo inode são dois nomes diferentes para o mesmo arquivo. Assim [ e comando de test são soft link 1 . Isso significa que você pode usar [ vez de test :

 if [ -e foo.test.txt ] then echo "This file exists" else echo "I can't find it anywhere.." fi 

Parece familiar?


1. No BASH, o test e [ são embutidos, então quando você executa estes comandos no BASH, ele não está rodando /bin/test ou /bin/[ . No entanto, eles ainda estão ligados uns aos outros.