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 / 411304
Accepted
bdesham
bdesham
Asked: 2017-12-17 11:48:20 +0800 CST2017-12-17 11:48:20 +0800 CST 2017-12-17 11:48:20 +0800 CST

Como faço para verificar se uma matriz zsh contém um determinado valor?

  • 772

Suponha que eu tenha um array não associativo que foi definido como

my_array=(foo bar baz)

Como posso verificar se o array contém uma determinada string? Prefiro uma solução que possa ser usada dentro da condicional de um ifbloco (por exemplo if contains $my_array "something"; then ...).

zsh
  • 2 2 respostas
  • 8888 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-17T15:56:30+08:002017-12-17T15:56:30+08:00
    array=(foo bar baz foo)
    pattern=f*
    value=foo
    
    if (($array[(I)$pattern])); then
      echo array contains at least one value that matches the pattern
    fi
    
    if (($array[(Ie)$value])); then
      echo value is amongst the values of the array
    fi
    

    $array[(I)foo]retorna o índice da última ocorrência de fooin $arraye 0 se não for encontrado. O esinalizador é para que seja uma ecorrespondência exata em vez de uma correspondência de padrão.

    Para verificar $valuese está em uma lista literal de valores, você pode passar essa lista de valores para uma função anônima e procurar o $valuein $@no corpo da função:

    if ()(( $@[(Ie)$value] )) foo bar baz and some more; then
      echo "It's one of those"
    fi
    

    Para saber quantas vezes o valor é encontrado no array, você pode usar o ${A:*B}operador (elementos do array Aque também estão no array B):

    array=(foo bar baz foo)
    value=foo
    search=("$value")
    (){print -r $# occurrence${2+s} of $value in array} "${(@)array:*search}"
    

    Ou usando correspondência de padrões nos elementos da matriz:

    (){print -r $# occurrence${2+s} of $value in array} "${(M@)array:#$value}"
    
    • 37
  2. bdesham
    2017-12-17T12:15:13+08:002017-12-17T12:15:13+08:00

    Se você tem um array $my_arraye quer saber se ele contém a string foo, um teste possível é

    [[ ${my_array[(ie)foo]} -le ${#my_array} ]]
    

    O valor completo e exato do elemento da matriz deve ser foo; não é uma verificação de substring ou algo assim.

    Se você quiser ver se o valor da variável $my_stringestá na matriz, use

    [[ ${my_array[(ie)$my_string]} -le ${#my_array} ]]
    

    Essa (ie)sintaxe não é muito óbvia. É explicado na seção Subscript Flags do manual do ZSH. A iparte significa que estamos usando “subscrito reverso”: ao invés de passar um subscrito e obter um valor, como fazemos com o usual ${my_array[1]}, estamos passando um valor e pedindo o primeiro subscrito que daria esse valor. Esse subscrito é numérico e baseado em 1 (o primeiro elemento da matriz está no índice 1), o que é diferente da convenção usada pela maioria das linguagens de programação. O ein (ie)significa que queremos uma correspondência exata, sem expandir caracteres de correspondência de padrão como *.

    Se o valor não for encontrado na matriz, ${my_array[(ie)foo]será avaliado como o primeiro índice após o final da matriz, portanto, para uma matriz de 3 elementos, retornará 4. ${#my_array}fornece o índice do último elemento da matriz; portanto, se o primeiro é menor ou igual ao último, então o valor fornecido está presente na matriz em algum lugar. Se você quiser verificar se um determinado valor não está na matriz, altere o “menor que ou igual a” para “maior que”:

    [[ ${my_array[(ie)foo]} -gt ${#my_array} ]]
    
    • 28

relate perguntas

  • Listar arquivos que não possuem outro arquivo com sufixo

  • Em que circunstâncias o executável encontrado primeiro no caminho não será usado

  • Symlinking para todos os arquivos de ponto e diretórios

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

Sidebar

Stats

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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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