51

ピリオドで区切られたフィールドを含む入力ファイルを 1 行ずつ読み取ろうとしています。後でループできるように、それらを配列の配列に入れたいと思います。入力は問題ないように見えますが、それを配列 (inData) に「プッシュ」することは機能していないようです。

コードは次のとおりです。

Input file: 
GSDB.GOSALESDW_DIST_INVENTORY_FACT.MONTH_KEY
GSDB.GOSALESDW_DIST_INVENTORY_FACT.ORGANIZATION_KEY


infile=${1}

OIFS=$IFS
IFS=":"

cat ${infile} | while read line
do
      line=${line//\./:}
      inarray=(${line})
#      echo ${inarray[@]}
#      echo ${#inarray[@]}      
#      echo ${inarray[0]}
#      echo ${inarray[1]}
#      echo ${inarray[2]}

      inData=("${inData[@]}" "${inarray[@]}")
done 
IFS=$OIFS

echo ${#inData[@]}   

for ((i = 0; i < ${#inData[@]}; i++))
do
 echo $i
    for ((j = 0; j < ${#inData[$i][@]}; j++))
    do
       echo ${inData[$i][$j]}
    done
done
4

7 に答える 7

31

bash のフィールド ネスト ボックスですが、例を参照して回避することはできません。

#!/bin/bash

# requires bash 4 or later; on macOS, /bin/bash is version 3.x,
# so need to install bash 4 or 5 using e.g. https://brew.sh

declare -a pages

pages[0]='domain.de;de;https'
pages[1]='domain.fr;fr;http'

for page in "${pages[@]}"
do
    # turn e.g. 'domain.de;de;https' into
    # array ['domain.de', 'de', 'https']
    IFS=";" read -r -a arr <<< "${page}"

    site="${arr[0]}"
    lang="${arr[1]}"
    prot="${arr[2]}"
    echo "site : ${site}"
    echo "lang : ${lang}"
    echo "prot : ${prot}"
    echo
done
于 2015-12-24T13:37:25.023 に答える
29

Bash は多次元配列をサポートしていません。試す

array=(a b c d)
echo ${array[1]}
echo ${array[1][3]}
echo ${array[1]exit}

それらをシミュレートする方法については、Advanced Bash Scripting Guideを参照してください。

于 2012-09-07T12:20:00.207 に答える
14

文字列を「配列」に分割できることを知っています。リストのリストを作成できます。たとえば、DB サーバー内のデータベースのリストのように。

dbServersList=('db001:app001,app002,app003' 'db002:app004,app005' 'dbcentral:central')

# Loop over DB servers
for someDbServer in ${dbServersList[@]}
do
    # delete previous array/list (this is crucial!)
    unset dbNamesList
    # split sub-list if available
    if [[ $someDbServer == *":"* ]]
    then
        # split server name from sub-list
        tmpServerArray=(${someDbServer//:/ })
        someDbServer=${tmpServerArray[0]}
        dbNamesList=${tmpServerArray[1]}
        # make array from simple string
        dbNamesList=(${dbNamesList//,/ })
    fi

    # Info
    echo -e "\n----\n$someDbServer\n--"

    # Loop over databases
    for someDB in ${dbNamesList[@]}
    do
        echo $someDB
    done
done

上記の出力は次のようになります。

----
db001
--
app001
app002
app003

----
db002
--
app004
app005

----
dbcentral
--
central
于 2016-03-01T16:25:02.250 に答える