web-dev-qa-db-ja.com

新しい値を配列要素に再割り当てする方法は?

同時に3つまたは4つのことを理解しようとしています。私が助けを必要としているのは、以前のスクリプトの実行で作成したすべてのファイルで最大数を取得する方法です。 (int)識別子を持つファイル。メタデータのないすべてのファイルを分離し、それらをすべて単一のフォルダーに保存しているため、上書きされないようにそれらを単一化します。

1つは、要素で正しい値を取得していることを確認することです。1つの要素のみを使用しています。最初の要素[0]は、0 .....無限大から順にインクリメントしてファイルを更新します。私が使用して考え出した増分。

(( array[0]++ ))

私を最も混乱させる部分は構文であり、私が手動でではなく、コンピュータによってその値を変更する方法です。スクリプトを作成するときに、スクリプトが停止した最後のファイルに入れられた最大の数値を取得する方法を理解する必要があります。次に、スクリプトを再度起動するときに、その番号を+1から開始して、最初からやり直さないようにします。値0は、最後に実行したときに作成された他のファイルを上書きするためだけです。

変数の値を失うコンピュータをシャットダウンすると、値が消えるのを知っているはずです。ファイルにアクセスして、私のためにそれを実行するスクリプトを取得するのではなく、これは私がこれまでに試してみて、最大数を取得する方法を理解するためのものです。 [0]要素内の新しい番号を取得して、最後にプラス1で終了した番号から開始するために、正しく記述していることをどのように確認しますか?

#!/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

私が理解しなければならないより大きな問題、スクリプト全体で変数を渡す必要があるすべての場所に変数を渡す方法。古い配列[0]の中に新しい値を入れて、それを使用する適切な場所に取得する必要があるため。完全に異なるwhileループ内。

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++
 ...............

したがって、私の2つの主要な質問は、配列内の値を持つ変数を使用してint値の再割り当てを正しく配列[element]に書き込む方法です。次に、+を使用してインクリメントまたはデインクリメントします。 +または-、そしてスクリプト全体にどのように渡すのですか?

なぜ私は得られないようです

array[0]=$newvalue 

仕事に?

私が読んだものはすべて、「彼らは何をしているのか」という非常に大きな複雑な見方をしています。それは、私が何をしたいのか、私を混乱させるだけの例にもほど遠いです。私が簡単な例から学び、そこから自分のプログラミングで成長できるようにするのは難しいと思います。

5
uxserx-bw

あなたのバージョンのBashが起動するのではないかと思います。私はこのバージョンを使っており、配列をうまく設定できます。

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

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

その後、それらを個別に呼び出すことができます。

$ echo ${array[0]}
0

$ echo ${array[1]}
1

$ echo ${array[2]}
2

またはリストとして:

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

配列を別の変数として呼び出すことはできません。

$ echo $array
0

これが原因で、正しく機能していないと誤解された可能性があります。また、配列要素に別の変数の値を設定することもできます。

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

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

ここでprintfを使用することもできます。そうすると、${array[@]}の結果を引用する理由がわかります。しかし、最初に文字列を配列に追加しましょう:

$ array[0]="a string"

引用符なし:

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

引用付き:

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

物事を渡す

Bash内で利用できる2つの戦術があります。変数をグローバルにスコープするように設定するだけです。これは多くの場合、ほとんどの人が採用している手法です。

もう1つの方法は、値、値をBash内の関数に渡すことです。 2つの値を渡す基本的な関数を示します。

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

今、私はそれを異なる引数で実行すると:

$ 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

ここでBash内の配列と関数の詳細を読んで、テクノロジーをよりよく理解することができます。

参考文献

9
slm