Como reatribuir novos valores aos elementos do array?

4

Estou tentando descobrir três ou quatro coisas ao mesmo tempo. O máximo que eu preciso de ajuda é como obter o maior número de todos os arquivos que criei em uma execução anterior do meu script, que criou um novo arquivo com um identificador (int). para separar todos os arquivos que não possuem metadados, para separá-los para evitar que todos eles sejam gravados porque estou armazenando todos eles na mesma pasta.

Agora é preciso ter certeza de que estou obtendo o valor correto no elemento, estou usando apenas um elemento, o primeiro [0] para atualizar o arquivo, incrementando-o na ordem de 0 .... infinito. O incremento que eu descobri usando.

(( array[0]++ ))

a parte que mais me confunde é a sintaxe e como eu tenho seu valor alterado pelo computador e não por mim manualmente. Eu preciso descobrir como obter o maior número que foi colocado no último arquivo em que o script parou ao criá-los, então comece com esse número + 1 quando eu iniciá-lo novamente para que ele não comece tudo de novo com o valor de zero apenas para gravar os outros arquivos que criou na última vez que o executei.

Como se deve saber, o valor desaparece quando eu desligo o computador, o que perde o valor das variáveis. em vez de ir no arquivo e procurando apenas obter um script para fazer isso por mim. isto é o que eu tenho até agora para tentar descobrir como obter o maior número. é como ter certeza de que estou escrevendo corretamente para que esse novo número dentro do elemento [0] comece com o último número que eu terminei em mais um?

#!/bin/bash

typeset -i xf mf sn bn hn n  snewnum d

let xf=1 mf=0 bn=3 hn=4 n=1 snewnum=0

#to keep track of which lost-song file number I am on
n=0 bn=3 hn=4
lostsongs[0]=2

###################################################
#
# FOR updating the lost song files so as not to 
# over write any
####################################
find /home/userx/testscripts/ -type f -name "*.mp3" | while [[ $n -le 4 ]] ; do
 read FILE;
nstring=${FILE##*/} #gets just the file name
lstring=${nstring##I*"("} #chops off Lside to the ( leaving num
rstring=${lstring%%")"*} #chops off Rside to the ) leaving the num

snewnum=$rstring #holds the char of type num 
echo $snewnum " new num before if"

lostsongs[n]="$snewnum"

echo "lostsongs[$n] = ${lostsongs[n]}"

echo ${#lostsongs[@]} " lostsongs length "

for(( a=0; a<${#lostsongs[@]}-1 ;a++ )); 
    do
        store=0;

        if [[ lostsongs[a+1]<lostsongs[a] ]]; then

            store=lostsongs[a];
            lostsongs[a]=$lostsongs[a+1];
            lostsongs[a+1]=$store;
            echo "$store  in a"
        fi


    done



let n++
done

O problema maior que estou tendo que descobrir, como passar variáveis por todo o script para todo lugar que eu precisar. Como eu preciso obter o array antigo [0] com o novo valor dentro dele para o local apropriado para usá-lo. Dentro de um loop while completamente diferente.

find ~/music/ -type f -name "*.mp3" | while [ $xf  -le 150  ] ; 
  do read FILENAME;
   ...............................
if [[ ! -n "$newArt" && ! -n "$newTit" && ! -n "$newAlb" ]] ; then

echo "${lostsogns[0]} that is Lsogn num.. before going to sogn"
newFile="I_HAVE_NO_IDEA-WHO-I-AM-(Lost-Song-Number-("${lostsongs[0]}"))-192k.mp3"
(( lostsongs[0]++ ))
let hn++
 ...............

Então, eu diria que minhas duas maiores perguntas são: como escrever corretamente uma reatribuição de um valor int usando uma variável com um valor dentro dela no array [elemento] outro, incrementando ou dessincronizando-o usando o ++ ou -, e como faço para passar tudo ao redor do script?

por que não consigo aparecer

array[0]=$newvalue 

para trabalhar?

Tudo o que eu li sempre tem essa aparência realmente grande "o que eles estão fazendo?" isso não é nem perto do que eu quero fazer exemplos que não fazem nada além de me confundir mais. Eu acho difícil fazer os exemplos simples para eu aprender a partir daí crescerem na minha programação.

    
por uxserx-bw 11.12.2013 / 03:25

1 resposta

9

Eu suspeitaria da sua versão do Bash para começar. Eu estou nesta versão e posso definir matrizes muito bem.

$ bash --version
GNU bash, version 4.2.45(1)-release (x86_64-redhat-linux-gnu)

Exemplo

$ array[0]=0
$ array[1]=1
$ array[2]=2

Você pode recuperá-los individualmente:

$ echo ${array[0]}
0

$ echo ${array[1]}
1

$ echo ${array[2]}
2

Ou como uma lista:

$ echo "${array[@]}"
0 1 2

Você não pode simplesmente chamar o array como outra variável:

$ echo $array
0

Acredito que isso possa ter sido o que o levou a pensar que não estava funcionando corretamente. Também definir um elemento de matriz com o valor de outra variável também funciona.

Exemplo

$ newval=3
$ array[2]=$newval

$ echo "${array[@]}"
0 1 3

Você também pode usar printf aqui. Isso mostra por que você deseja citar os resultados de ${array[@]} . Mas primeiro vamos adicionar uma string ao array:

$ array[0]="a string"

Sem as aspas:

$ printf "%s\n" ${array[@]}
a
string
1
3

Com aspas:

$ printf "%s\n" "${array[@]}"
a string
1
3

Passando as coisas

Bem, você tem 2 táticas que você pode usar no Bash. Você pode simplesmente definir variáveis para que elas sejam globalmente definidas. Essa é frequentemente a técnica que a maioria das pessoas emprega.

O outro método envolve passar por valor, valores para funções dentro do Bash. Vou mostrar uma função básica onde eu passo 2 valores.

Exemplo

$ function hello() {
 printf "I got arg1: %d and arg2: %d\n" $1 $2
}

Agora, quando eu executo com argumentos diferentes:

$ hello 1 2
I got arg1: 1 and arg2: 2

$ hello 3 4
I got arg1: 3 and arg2: 4

$ hello 3 blah
bash: printf: blah: invalid number
I got arg1: 3 and arg2: 0

Você pode ler mais sobre arrays e funções no Bash aqui para entender melhor as tecnologias.

Referências

por 11.12.2013 / 04:39