[ x$1 = x ]
Faz sentido apenas em zsh
. Isso compara a concatenação de x
com o primeiro argumento do script para x
. Portanto, o comando [
retornará verdadeiro se $1
estiver vazio ou não for fornecido.
[ $1 = "" ]
Não funcionaria porque, em zsh
quando uma variável vazia não é citada em contextos de lista, ela se expande para nenhum argumento em vez de um argumento vazio, portanto, se $1
não estiver definido ou vazio, [
comando receberia apenas como argumentos [
, =
, a string vazia e ]
dos quais não fazia sentido. [ -z "$1" ]
ou [ "$1" = "" ]
seria OK, como em shells POSIX.
Em shells do tipo Bourne-like / POSIX, [ x$1 = x ]
não faz sentido. Esse é o operador de divisão + glob aplicado de alguma forma à concatenação de x
e o primeiro argumento do script esperando que o resultado e =
e x
e ]
constituam uma expressão de teste válida para o [
comando.
Por exemplo, se o script tiver recebido um argumento " = x -o x ="
, [
receberia esses argumentos: [
, x
, =
, x
, -o
, x
, =
, x
, ]
, que [
entenderia como comparando x
com x
e x
com x
e retornará verdadeiro.
Se $1
fosse "* *"
, o shell passaria para o comando [
a lista de arquivos no diretório atual cujo nome começa com x
(a expansão glob de x*
). lista de arquivos não ocultos (expansão *
) ... que [
provavelmente não conseguirá ter sentido. Os únicos casos em que isso faria qualquer coisa sensata são se $1
não contiver caracteres curinga ou em branco.
Agora, o que você às vezes encontra é um código como:
[ "x$1" = x ]
Isso é usado para testar se $1
está vazio ou não definido.
A maneira normal de testar uma variável vazia ou não definida é:
[ -z "$1" ]
Mas isso falha em alguns valores de $1
como =
em algumas implementações (não-POSIX) [
, como a integrada em um shell Bourne, como /bin/sh
no Solaris 10 e antes ou em algum antigo versões de dash
(até 0.5.4) ou sh
de alguns BSDs.
Isso porque [
vê [
, -z
, =
, ]
e reclama sobre argumentos ausentes para o operador =
binário em vez de entendê-los como o operador -z
unário aplicado ao =
string.
Da mesma forma, [ "$1" = "" ]
falha em algumas implementações de [
se $1
for !
ou (
.
Nestas implementações shell / [
:
[ "x$1" = x ]
é sempre um teste válido, independentemente do valor de $1
, portanto:
[ "" = "$1" ]
e:
[ -z "${1:+x}" ]
e
case $1 in "") ...; esac
Claro, se você quiser verificar se nenhum argumento é fornecido, faça o seguinte:
[ "$#" -eq 0 ]
Ou seja, você verifica o número de argumentos passados para o script.
Note que hoje em dia, [ -z "$var" ]
é claramente especificado por POSIX e não pode falhar em conformidade com [
implementations (e bash
[
é e tem sido por décadas). Então você deve poder confiar nele nos scripts POSIX sh ou bash
.