Eu quero escrever um script que faça um loop através de 15 strings (possivelmente array?) Isso é possível?
Algo como:
for databaseName in listOfNames
then
# Do something
end
Você pode usá-lo assim:
## declare an array variable
declare -a arr=("element1" "element2" "element3")
## now loop through the above array
for i in "${arr[@]}"
do
echo "$i"
# or do whatever with individual element of the array
done
# You can access them using echo "${arr[0]}", "${arr[1]}" also
Também funciona para declaração de matriz com várias linhas
declare -a arr=("element1"
"element2" "element3"
"element4"
)
Isso é possível, é claro.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Consulte Bash Loops para, enquanto e até para obter detalhes.
for year in $(seq 2000 2013)
.DATABASES="a b c d e f"
,.Nenhuma dessas respostas inclui um contador ...
Resultado:
fonte
echo "$i / ${arraylength} : ${array[$i-1]}"
- caso contrário, se você$i
contiver um globo, ele será expandido, se contiver uma guia, será alterado para um espaço, etc.sim
Resultado:
Preservar espaços; entradas da lista de cotações simples ou duplas e expansões da lista de cotações duplas.
Resultado:
Para fazer a lista em várias linhas
Resultado:
Variável de lista simples
ou
Exiba a variável da lista:
Resultado:
Percorra a lista:
Resultado:
Crie uma função para percorrer uma lista:
Usando a palavra-chave declare (comando) para criar a lista, que é tecnicamente chamada de matriz:
Resultado:
Criando uma matriz associativa. Um dicionário:
Resultado:
Variáveis ou arquivos CVS em uma lista .
Alterando o separador interno de campos de um espaço para o que você quiser.
No exemplo abaixo, ele é alterado para vírgula
Resultado:
Se for necessário numerá-los:
isso é chamado de retorno. Coloque o comando dentro de back ticks.
É o próximo ao número um do teclado e ou acima da tecla Tab. Em um teclado de inglês americano padrão.
A saída é:
Familiarizando-se com o comportamento do bash:
Crie uma lista em um arquivo
Leia o arquivo da lista em uma lista e exiba
Manual de referência da linha de comando do BASH: significado especial de certos caracteres ou palavras para o shell.
fonte
"${List[@]}"
estar correto, com as aspas .${List[@]}
está errado.${List[*]}
está errado. ExperimenteList=( "* first item *" "* second item *" )
- você obterá o comportamento correto parafor item in "${List[@]}"; do echo "$item"; done
, mas não de qualquer outra variante.List=( "first item" "second item" )
será dividido emfirst
,item
,second
,item
também).ls
produção, contrariando as melhores práticas .No mesmo espírito da resposta de 4ndrew:
B. Nenhum espaço em branco nos nomes:
Notas
listOfNames="RA RB R C RD"
tem a mesma saída.Outras maneiras de trazer dados incluem:
Leia de stdin
IFS='\n'
, ou para MacOSIFS='\r'
)#!/bin/bash
na parte superior do arquivo de script indica o ambiente de execução.Outras fontes ( enquanto lê o loop )
fonte
IFS
. (Para todos,IFS
deixe-se especificar um delimitador específico, que permita que outro espaço em branco seja incluído nas seqüências de caracteres sem ser separado em substrings).$databaseName
contém apenas a lista inteira, portanto, apenas uma iteração única.Você pode usar a sintaxe de
${arrayName[@]}
fonte
Surpreso que ninguém tenha postado isso ainda - se você precisar dos índices dos elementos enquanto estiver percorrendo a matriz, poderá fazer o seguinte:
Resultado:
Acho isso muito mais elegante que o estilo "tradicional" de loop for (
for (( i=0; i<${#arr[@]}; i++ ))
).(
${!arr[@]}
e$i
não precisam ser citados porque são apenas números; alguns sugerem citá-los de qualquer maneira, mas isso é apenas preferência pessoal.)fonte
Também é fácil de ler:
fonte
IFS=$'\n'
Isso pode funcionar para outras soluções também neste cenário.Matriz implícita para script ou funções:
Além da resposta correta do anubhava : Se a sintaxe básica do loop for:
existe um caso especial embater:
Ao executar um script ou uma função, os argumentos passados em linhas de comando será atribuído a
$@
variável de matriz, você pode acessar por$1
,$2
,$3
e assim por diante.Isso pode ser preenchido (para teste) por
Um loop sobre esse array poderia ser escrito simplesmente:
Observe que o trabalho reservado
in
não está presente e também não há nome para o array!Amostra:
Observe que isso é igual a
Depois, em um script :
Salve isso em um script
myscript.sh
echmod +x myscript.sh
, em seguida,O mesmo em uma função :
Então
fonte
ou apenas
fonte
Maneira simples :
fonte
A matriz declare não funciona para o shell Korn. Use o exemplo abaixo para o shell Korn:
fonte
for i in ${foo[*]}
é basicamente sempre a coisa errada -for i in "${foo[@]}"
é a forma que preserva os limites da lista original e evita a expansão global. E o eco precisa serecho "$i"
Isso é semelhante à resposta do usuário2533809, mas cada arquivo será executado como um comando separado.
fonte
Se você estiver usando o shell Korn, haverá " set -A databaseName ", caso contrário, haverá " declare -a databaseName "
Para escrever um script trabalhando em todas as conchas,
Deve funcionar em todas as conchas.
fonte
$ bash --version
GNU bash, versão 4.3.33 (0) -release (amd64-portbld-freebsd10.0)$ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: erro de sintaxe próximo ao token inesperado `('Tente isso. Está funcionando e testado.
fonte
array=( "hello world" )
, ouarrray=( "*" )
; no primeiro caso, ele irá imprimirhello
eworld
separadamente, na segunda ele irá imprimir uma lista de arquivos em vez do*
Possível primeira linha de cada script / sessão do Bash:
Use, por exemplo:
Pode considerar:
echo
interpreta-e
como opção aquifonte
Loop de linha única,
você obterá uma saída como esta,
fonte
O que eu realmente precisava para isso era algo assim:
Por exemplo:
(Mataria todos os processos com vlc em seu nome)
fonte
Eu percorrer uma matriz dos meus projetos para uma
git pull
atualização:fonte