AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 784363
Accepted
KDM
KDM
Asked: 2024-10-02 11:41:52 +0800 CST2024-10-02 11:41:52 +0800 CST 2024-10-02 11:41:52 +0800 CST

É [..] compatível com posix enquanto [[..]] não é [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
Qual é a diferença entre os operadores Bash [[ vs [ vs ( vs ((? (7 respostas)
Fechado ontem .

Li em algum lugar que em um script de shell a [..]construção like por exemplo [ -e $HOME/temp ]é compatível com POSIX. Enquanto a [[..]]construção de script like [[ -e $HOME/temp ]]não é.

Isso é verdade?

Além da conformidade com POSIX, há algo inerentemente vantajoso que [..] tem sobre [[..]]? Ou vice-versa?

shell-script
  • 1 1 respostas
  • 49 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-10-02T14:07:06+08:002024-10-02T14:07:06+08:00

    Sim, o [utilitário também é conhecido como testpadrão, você pode encontrar uma versão HTML de sua especificação POSIX 2024 no site do OpenGroup .

    Houve uma proposta para especificar ksh's [[...]]na shlinguagem POSIX , mas ela acabou sendo rejeitada (reduzida para apenas adicionar alguns operadores extras [que são comuns à maioria das implementações).

    Você verá a seção de justificativa afirmando:

    O comando condicional derivado do KornShell (colchete duplo [[]]) foi removido da descrição da linguagem de comando do shell em uma proposta inicial. Objeções foram levantadas de que o problema real é o uso incorreto do comando test ( [), e colocá-lo no shell é a maneira errada de corrigir o problema. Em vez disso, a documentação adequada e uma nova palavra reservada do shell (!) são suficientes. Uma proposta posterior para adicionar [[]]no Issue 8 também foi rejeitada porque implementações existentes dele foram consideradas propensas a erros de forma semelhante às versões históricas do test, e também havia muita variação no comportamento entre os shells que o suportam.

    Algumas das diferenças relevantes entre [[...]]e [:

    • combinar mais de um teste em uma invocação de forma confiável é mais fácil de fazer com [[...]]do que com [...](onde os operadores -a/ -oestão realmente obsoletos, pois não podem ser usados ​​de forma confiável), mas usar [ ... ] && [ ... ] || [ ... ]é bom e não incorre em penalidades, pois [é invariavelmente integrado, o que torna [[...]]o próprio &&/ redundante (e potencialmente confuso, pois as regras de precedência são diferentes do / ||do shell ).&&||
    • [[ $string = $pattern ]]faz, na verdade, correspondência de padrões em vez de comparação de igualdade. Isso também é redundante com a caseconstrução padrão e fonte de bugs, pois as pessoas tendem a pensar que é aceitável deixar variáveis ​​sem aspas dentro [[...]](e geralmente é) e esquecem de fazer isso [[ $string1 = "$string2" ]]ao comparar strings para igualdade.
    • piora com [[ $string =~ $pattern ]]o que é feito de forma diferente dependendo do shell. O bash e alguns outros shells tomaram uma decisão infeliz de ter aspas influenciando a operação regex lá, o que é errado, pois a sintaxe regex não é compatível com a tokenização normal do shell (mais detalhes em Como armazenar a expressão regular em uma variável de shell evita problemas com aspas de caracteres que são especiais para o shell? e no bug do Austin Group mencionado acima). O builtin do zsh e do yash também [tem um operador.=~
    • na maioria dos shells, os operadores aritméticos de [[...]]interpretam seus operandos como expressões aritméticas (o que torna as coisas como [[ $1 -eq $2 ]]uma vulnerabilidade de injeção de comando na maioria dos shells (e causa surpresas quando os números começam com 0, o que os faz ser interpretados como octais em alguns shells). Enquanto POSIX requer que operandos para aqueles de [sejam tratados como inteiros decimais .
    • as regras de análise [[...]]são específicas para a construção e variam de shell para shell, enquanto [é apenas um comando simples, portanto, tratado como qualquer outro comando.

    Então [geralmente está tudo bem e, para citar POSIX, o verdadeiro problema é o uso incorreto do testcomando ( [) .

    Contanto que você se lembre de citar variáveis ​​e outras expansões (conforme necessário para todos os comandos, não apenas [) e não use os operadores binários obsoletos -a(e), (ou) (e que não são necessários de qualquer maneira, uma vez que você não pode combinar mais de um teste), está tudo bem (e mais seguro ao fazer comparações numéricas).-o(...)[

    [[...]]pode ser melhor, pois pode tornar o código mais curto, pode permitir que alguém pule a citação de algumas expansões, mas isso é principalmente açúcar sintático, mas às custas de ter que aprender sintaxe extra e suas peculiaridades.

    • 3

relate perguntas

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Um script que imprime as linhas de um arquivo com seu comprimento [fechado]

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Dividir por delimitador e concatenar problema de string

  • MySQL Select com função IN () com array bash

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve