Sou novo no bash e não consigo encontrar um bom tutorial para responder à minha pergunta.
array=( item1 item2 item3 ) for name in ${array[@]}; do echo current/total ... some other codes done
Quero calcular o valor current
e total
, como a saída esperada disso sendo:
1/3 2/3 3/3
Obrigado por qualquer tipo de dicas.
Comentários
Resposta
Você pode acessar os índices da matriz usando ${!array[@]}
e o comprimento da matriz usando ${#array[@]}
, por exemplo :
#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $index/${#array[@]} done
Observe que, como os arrays bash são indexados por zero , você realmente obterá:
0/3 1/3 2/3
Se quiser que a contagem comece a partir de 1, você pode substituir $index
por $((index+1))
. Se você deseja os valores , bem como os índices, pode usar "${array[index]}"
ou seja,
#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $((index+1))/${#array[@]} = "${array[index]}" done
dando
1/3 = item1 2/3 = item2 3/3 = item3
Comentários
- Se eu quiser obter 1,2,3, posso Eu faço isso:
echo ($index+1)/${#array[@]}
? - aliás, parece que desta forma eu não posso ' obter o item1, item2, item3 no loop. Eu ainda tenho outro código para lidar com as coisas item1, item2, item3. Obrigado,
- Veja a postagem editada.
Resposta
Um índice zero é perfeitamente válido se você acha que o índice é, na verdade, um deslocamento do endereço base de uma matriz. Na verdade, essa é a norma, embora varie de dialeto para dialeto. Com a antiga linguagem Jovial, [0]
na verdade continha o tamanho máximo da matriz. Portanto, começou com [1]
.
Com algumas implementações básicas, você pode arbitrariamente optar por 0
ou 1
como o primeiro índice. E pelo menos um Basic permite que você designe matrizes para indexar de [n]
a [m]
. onde n
e m
podem ter qualquer valor inteiro, mesmo negativo, desde que n
seja menor que ou igual a m
. O valor n
deles é subtraído de [index]
inserido, como index-n = 0
se o índice corresponder a n
.
Mas você pode fazer a mesma coisa e muito mais em seu próprio código . Você pode até inverter a ordem de uma matriz desta forma:
dim array(0, abs(m-n)); step=sign(m-n); if n > m then base=m else base=n; fi
Este exemplo de código é, na verdade, apenas parcialmente de um idioma. Eu só queria que fosse mais legível. A variável step é usada para controlar a direção aparente em que você está se movendo, seja positiva ou negativa, e é usada para calcular o índice efetivo ao entrar ou sair da matriz, que na verdade é sempre positiva de [0]
.
${array[@]}
entre aspas duplas. Caso contrário, a divisão de palavras será realizada e você obterá resultados indesejáveis em entradas comoarray=("item 1" "item 2" "item 3")
.