88

次のように初期化されたアプリケーションの配列があります。

depends=$(cat ~/Depends.txt)

リストを解析して新しい配列にコピーしようとすると、

for i in "${depends[@]}"; do
   if [ $i #isn't installed ]; then
      newDepends+=("$i")
   fi
done

何が起こるかというと、depends の最初の要素だけが newDepends になります。

for i in "${newDepends[@]}"; do
   echo $i
done

^^これは1つだけを出力します。だから、私のforループが最初の要素だけを動かしている理由を理解しようとしています。リスト全体はもともと依存しているので、そうではありませんが、私はすべてアイデアがありません。

4

11 に答える 11

158
a=(foo bar "foo 1" "bar two")  #create an array
b=("${a[@]}")                  #copy the array in another one 

for value in "${b[@]}" ; do    #print the new array 
echo "$value" 
done   
于 2014-06-20T08:44:01.680 に答える
38

非連想配列を bash でコピーする最も簡単な方法は次のとおりです。

arrayClone=("${oldArray[@]}")

または既存の配列に要素を追加するには:

someArray+=("${oldArray[@]}")

要素内の改行/スペース/IFS は保持されます。

連想配列をコピーするには、Isaac のソリューションが最適です。

于 2016-01-12T00:02:31.940 に答える
8

他の回答で与えられた解決策は、連想配列、または連続していないインデックスを持つ配列では機能しません。より一般的な解決策は次のとおりです。

declare -A arr=([this]=hello [\'that\']=world [theother]='and "goodbye"!')
temp=$(declare -p arr)
eval "${temp/arr=/newarr=}"

diff <(echo "$temp") <(declare -p newarr | sed 's/newarr=/arr=/')
# no output

そしてもう一つ:

declare -A arr=([this]=hello [\'that\']=world [theother]='and "goodbye"!')
declare -A newarr
for idx in "${!arr[@]}"; do
    newarr[$idx]=${arr[$idx]}
done

diff <(echo "$temp") <(declare -p newarr | sed 's/newarr=/arr=/')
# no output
于 2014-08-06T23:02:48.177 に答える
2

インデックスを指定して最初の配列の要素をコピーに挿入することで、配列をコピーできます。

#!/bin/bash

array=( One Two Three Go! );
array_copy( );

let j=0;
for (( i=0; i<${#array[@]}; i++)
do
    if [[ $i -ne 1 ]]; then # change the test here to your 'isn't installed' test
        array_copy[$j]="${array[$i]}
        let i+=1;
    fi
done

for k in "${array_copy[@]}"; do
    echo $k
done

これの出力は次のようになります。

One
Three
Go!

bash 配列に関する有用なドキュメントはTLDPにあります。

于 2013-10-17T02:27:38.233 に答える
0

Bash 4.3以降では、これを行うことができます

$ alpha=(bravo charlie 'delta  3' '' foxtrot)

$ declare -n golf=alpha

$ echo "${golf[2]}"
delta  3
于 2015-04-25T23:29:08.250 に答える
0
array_copy() {
    set -- "$(declare -p $1)" "$2"
    eval "$2=${1#*=}"
}

# Usage examples:

these=(apple banana catalog dormant eagle fruit goose hat icicle)
array_copy these those
declare -p those

declare -A src dest
source=(["It's a 15\" spike"]="and it's 1\" thick" [foo]=bar [baz]=qux)
array_copy src dest
declare -p dest

注: 連想配列をコピーする場合、コピー先は連想配列として既に存在している必要があります。そうでない場合は、array_copy()それを標準配列として作成し、連想ソースからのキー名を算術変数名として解釈しようとしますが、見苦しい結果になります。

evalIsaac Schwabacher のソリューションは、この点でより堅牢ですが、そのステップがステートメント全体を評価し、declarebash がそれらを関数内にある場合と同等に扱うため、関数にきちんとラップすることはできませんlocal。これは、-gオプションを評価されたものに押し込むことで回避できますdeclareが、目的の配列に想定以上のスコープが与えられる可能性があります。array_copy()明示的にスコープされた宛先への実際のコピーのみを実行した方がよいと思います。

于 2021-12-29T14:54:48.113 に答える
0

配列を別の配列にコピーできました。

firstArray=()
secondArray=()

firstArray+=("Element1")
firstArray+=("Element2")

secondArray+=("${firstArray[@]}")

for element in "${secondArray[@]}"; do
  echo "${element}"
done
于 2021-11-24T16:59:08.150 に答える
-1

これが私にとってうまくいくことがわかりました(ほとんど:))...

eval $(declare -p base | sed "s,base,target,")

sed コマンドを拡張して、必要に応じて任意のスイッチを編集します。たとえば、新しい構造を書き込み可能にする必要がある場合は、読み取り専用 ( -r) を編集します。

于 2021-06-22T15:55:53.843 に答える