Na resposta a esta pergunta sobre comentários em scripts de shell , é indicado que :
é um comando nulo que explicitamente não faz nada (mas não deve ser usado para comentários).
Qual seria a utilidade de um comando que não faz absolutamente nada?
shell
shell-script
DQdlM
fonte
fonte
:
é necessário para ser um built-in, enquantotrue
não é, o que afeta o escopo de variáveisRespostas:
Eu normalmente uso
true
em loops; Eu acho que é mais claro:O único lugar que achei
:
realmente útil é o caso, se você precisar corresponder a algo, mas não quiser realmente fazer nada. Por exemplo:fonte
true
para uma condição,:
para um NOP.case a in a ) ;; esac
. Existem algumas conchas que não aceitam isso?case ${var} in value);; *) do_something;; esac
is acceptable. The:
command is not needed for empty cases.Originalmente, era usado para determinar que era um programa shell Bourne, em oposição ao programa compilado em C. Isso foi antes do shebang e de várias linguagens de script (csh, perl). Você ainda pode executar um script começando com apenas
:
:Geralmente, ele executa o script contra
$SHELL
(ou/bin/sh
).Desde então, o principal uso é avaliar os argumentos. Eu ainda uso:
para definir um valor padrão em um script.
fonte
:
é útil para gravar loops que devem ser finalizados de dentro.Isto irá executar sempre a menos
break
ouexit
é chamado, ou o shell recebe um sinal de terminação.fonte
while true; do ...; done
Comunica intenções para o leitor melhor do quewhile :; do ...; done
Quando você deseja uma instrução "a menos que" no script de shell, usa uma condição "não", que pode parecer ridícula para alguns dos testes ou usa ':' na cláusula true, com código real no false cláusula.
A "condição exótica" pode ser algo que você não deseja negar, ou isso é muito mais claro se você não usar "lógica negativa".
fonte
autoconf
porque é muito mais fácil adicionar um padrão:
para ramificações vazias do que descobrir como reverter a condição.!
diante de[ some-exotic-condition ]
um pateta, mas um supérfluo: else
depois dele não é pateta.!
token nega todo um elemento do tubo de comando.while ! grep ... ; do ... done
ouif ! [ ... ] ; then ... fi
. É basicamente externo àtest/[]
sintaxe. Veja: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Eu só usei isso além do caractere # para comentar temporariamente uma linha, em uma situação em que comentar a linha produz um erro de sintaxe, devido a um defeito na gramática do shell de não permitir uma sequência vazia de comandos :
Sem o comando: falta uma sequência de comandos, que é um erro de sintaxe.
fonte
Há dois casos em que acho
:
útil:Atribuições de variável padrão
Essa é uma maneira conveniente de permitir que os usuários do seu script shell substituam uma configuração sem editar o script. (No entanto, argumentos de linha de comando são melhores porque você não corre o risco de comportamento inesperado se o usuário tiver coincidentemente a variável que você usa no ambiente exportado.) Veja como o usuário substituirá a configuração:
A
${VAR=value}
sintaxe diz ao setVAR
paravalue
seVAR
já não estiver definida e, em seguida, expanda para o valor da variável. Como ainda não nos importamos com o valor da variável, ela é passada como argumento ao comando no-op:
para jogá-la fora.Mesmo sendo
:
um comando não operacional, a expansão é realizada pelo shell (não pelo:
comando!) Antes de executar o comando:
comando, para que a atribuição de variável ainda ocorra (se aplicável).Também seria aceitável usar
true
ou algum outro comando em vez de:
, mas o código se torna mais difícil de ler porque a intenção é menos clara.O script a seguir também funcionaria:
Mas o acima é muito mais difícil de manter. Se uma linha usando
${VAR}
for adicionada acima dessaprintf
linha, a expansão da atribuição padrão deverá ser movida. Se o desenvolvedor esquecer de mover essa atribuição, um bug será introduzido.Algo para colocar em um bloco condicional vazio
Blocos condicionais vazios geralmente devem ser evitados, mas às vezes são úteis:
Algumas pessoas argumentam que ter um
if
bloco verdadeiro vazio pode facilitar a leitura do código do que negar o teste. Por exemplo:é sem dúvida mais fácil de ler do que:
No entanto, acredito que existem algumas abordagens alternativas que são melhores do que um verdadeiro bloco vazio:
Coloque a condição em uma função:
Coloque a condição dentro de chaves (ou parênteses, mas os parênteses geram um processo de subcamação e todas as alterações feitas no ambiente dentro da subcamada não serão visíveis fora dela) antes de negar:
Use em
||
vez deif
:Eu prefiro essa abordagem quando a reação é simples, como afirmar condições:
fonte
No antigo shell pré-bourne nas versões antigas do UNIX, o
:
comando era originalmente destinado a especificar rótulos paragoto
(era um comando separado que direciona a entrada para onde o rótulo é encontrado, para que rótulos não pudessem ser uma sintaxe separada que o O shell sabe sobre o.if
também foi um comando separado.) Logo se tornou usado para comentários, antes que houvesse uma sintaxe de comentário (#
era usada para backspace) e hoje em dia existe compatibilidade tanto quanto qualquer outra coisa.fonte
Além de usá-lo como uma declaração que não faz nada, você pode usá-lo para comentar declarações únicas, transformando-as em argumentos para:.
fonte
: echo write this line > myfile
ainda criará um arquivo vazio.:
é um mecanismo de comentário adequado.