Estou lendo o script bash, não entendo o que está acontecendo lá.
#!/bin/sh
[ x$1 = x ]
O que está acontecendo na segunda linha e o que [ x$1 = x ]
significa?
Isso verifica que $1
está vazio, embora deva ser citado (idêntico a [ -z "$1" ]
). Alguns shells muito antigos não lidavam com seqüências de caracteres vazias corretamente, então os escritores de scripts portáteis adotaram esse estilo de verificação. Não é necessário há décadas, mas as pessoas ainda fazem dessa maneira porque as pessoas ainda fazem dessa maneira.
[ x$1 = x ]
ainda está incorreto, mas[ "x$1" = x ]
seria para as conchas que têm um problema em que$1
é!
ou(
ou-n
....[ "" = "$1" ]
ecase $1 in "")
também seria bom.[ -z "$1" ]
e[ "$1" = "" ]
ainda não funciona com o / bin / sh do Solaris 10, o primeiro com o traço-0.5.4.[ "$1" = "" ]
ainda não funciona com ela/bin/sh
(embora você queira usá-la/usr/xpg4/bin/sh
lá/bin/sh
). o traço foi corrigido nesse sentido em janeiro de 2009.Colchetes indicam um teste ; portanto,
[ x$1 = x]
semif
ou algo semelhante não faz sentido, embora sintaticamente ok.Ele serve para avaliar se true se
x$1
expande parax
e false em caso contrário, mas como não é citado, se$1
for (por exemplo) "ei x", o shell veráx = x
, portanto essa construção ainda não é segura.O objetivo da
x = x
verificação é determinar se uma variável está vazia. Uma maneira mais comum de fazer isso seria usar apenas aspas:Os operadores de teste Bash
-z
e-n
também podem ser usados, mas são menos portáteis para outros tipos de cascas. 1 1O motivo das aspas, ou o
x$1
, é para que o lado esquerdo não se expanda a nada, o que seria um erro sintático:1. Na verdade,
test
pode ser um utilitário independente, mas a maioria dos shells o implementa como um built-in; verifique a diferença entrewhich test
etype test
. No GNU / Linux,man test
alega-se ao built-in, mas se você chamar (por exemplo)/usr/bin/test
, esse utilitário parece implementar os recursos documentados na página de manual, incluindo-z
e-n
.fonte
[ x$1 = x ]
também avaliará se$1
é verdade, por exemplo" -o x"
. Tentesh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
.[ x$1 = x ]
está errado e não faz sentido.if
para usotest
, você pode usá-lo antes&&
,||
ou depoiswhile
ou examinar o resultado usando$?
Só faz sentido
zsh
. Isso compara a concatenação dex
com o primeiro argumento do script parax
. Portanto, o[
comando retorna true se$1
estiver vazio ou não for fornecido.Não iria funcionar porque,
zsh
quando uma variável vazia não é citado em contextos da lista, ele se expande para nenhum argumento em tudo, em vez de um argumento vazio, por isso, se$1
foram unset ou vazio, o[
comando seria só recebem como argumentos[
,=
a string vazia e do]
qual não fazia sentido.[ -z "$1" ]
ou[ "$1" = "" ]
seria bom, como nos shell do POSIX.Em conchas tipo Bourne / POSIX,
[ x$1 = x ]
não faz sentido. Esse é o operador split + glob de alguma forma aplicado à concatenaçãox
e ao primeiro argumento do script, esperando que o resultado e=
ex
, e]
compor uma expressão de teste válida para o[
comando.Por exemplo, se o script foi passado um
" = x -o x ="
argumento,[
iria receber esses argumentos:[
,x
,=
,x
,-o
,x
,=
,x
,]
, que[
iria entender como compararx
comx
ex
comx
e retornar verdadeiro.Se
$1
fosse"* *"
, o shell passaria para o[
comando a lista de arquivos no diretório atual cujo nome começa comx
(a expansão global dex*
), a lista de arquivos não ocultos (expansão*
) ... que[
é improvável que seja possível para fazer algum sentido. Os únicos casos em que isso faria algo sensato é se$1
não contiver caracteres curinga ou caracteres em branco.Agora, o que você encontra às vezes é um código como:
Isso é usado para testar se
$1
está vazio ou não definido.A maneira normal de testar uma variável vazia ou não configurada é:
Mas isso falha em alguns valores
$1
como=
em algumas[
implementações (não POSIX), como a incorporada no shell Bourne, como encontrada/bin/sh
no Solaris 10 e em versões anteriores ou anteriores dedash
(até 0.5.4) oush
de alguns BSDs.Isso porque
[
vê[
,-z
,=
,]
e reclama sobre a falta de argumentos para o=
operador binário em vez de compreendê-lo como o-z
operador unário aplicado à=
string.Da mesma forma,
[ "$1" = "" ]
falha em algumas implementações de[
if$1
is!
ou(
.Naqueles shell /
[
implementações:é sempre um teste válido, independentemente do valor de
$1
, também são:e:
e
Obviamente, se você quiser verificar se nenhum argumento é fornecido, faça:
Ou seja, você verifica o número de argumentos transmitidos para o script.
Note-se que hoje em dia,
[ -z "$var" ]
é claramente especificado pelo POSIX e não pode falhar em conformant[
implementações (ebash
's[
é e tem sido há décadas). Portanto, você deve poder confiar nele no sh POSIX ou nosbash
scripts.fonte
x$1
está concatenando duas cadeiasx
e,$1
se $ 1 estiver vazio, x $ 1 será igual a x, e [x $ 1 = x] será verdadeiro como resultado.x = y
é usado para comparar string em shfonte
x$1
não é citado, portanto, a divisão e o globbing são executados nesses.[ x$1 = x ]
é verdadeiro se$1
não estiver definido / nulo / vazio ou não.Tente você mesmo com:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
e
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"
fonte
[ x$1 = x ]
também é verdade se,$1
por exemplo" -o x"
. Tentesh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
.[ x$1 = x ]
está errado e não faz sentido.