文字列配列の要素にアクセスする - stray@シンボル

文字列配列の要素にアクセスする - stray@シンボル

配列(3つの要素)を作成しました。各要素にはカンマで区切られた文字列が含まれています。配列は、ファイルを1行ずつ読み取ることによって生成されます。ファイルには、データベースから出力されたフィールドが含まれています。各文字列要素が配列のように繰り返されるように、以下のコードを書きました。

配列の最後の要素に追加の@記号がある奇妙なバグを除いて、これはうまくいきます。

(また、Macでbash 4を使用していると判断しましたが、-Aが機能しないと述べました。)

i=0
declare -a items
while read line
    do
        items[i]=$line
    ((i++))
    done < test_file1.txt

declare -a item_arr
for item in "${items[@]}"
   do
     item_arr=($item[@])
   done
echo "${item_arr[4]}://${item_arr[1]}:${item_arr[3]}@${item_arr[2]}/control/configinfo"

出力は次のとおりです。 https[@]://192.168.1.152:username@pwd/control/configinfo

@シンボルが印刷されるのはなぜですか?時間を無駄にしていますか? awkを使うべきですか?そうでなければ、これは非常に単純なアプローチのように感じますが、これは比較的経験が不足している可能性があります。初期化する必要がある項目の最大数はおそらく1〜200です。

私のコードの目的は、各プロジェクトのカールリクエストを作成するために、データベースからいくつかのconfig_info、ユーザー名、パスワード、IPアドレス、プロトコルをすべて取得するカールリクエストを生成することです。

よろしくお願いします!

答え1

itemはスカラー文字列変数(配列ではない)なので、次のように話す必要があります。

item_arr=($item)

代わりに

item_arr=($item[@])

もし$itemそうThe quick brown fox

item_arr=($item[@])

~になる

item_arr=(The quick brown fox[@])

答え2

あなたは正しいです、awkは簡単です。

ソース例/tmp/test2.txt:

$ cat /tmp/test2.txt
192.168.1.152 pwd username https
$ awk '{print $4 "://" $1 ":" $3 "@" $2 "/control/configinfo" }' /tmp/test2.txt
https://192.168.1.152:username@pwd/control/configinfo

答え3

bashファイルの内容(IPアドレス、ユーザー名、パスワードなど)をシェルメモリ(配列など)に保存する必要がないと仮定し、pureでこれを簡単に行うには、次のようにします。

while read ip_address pwd username protocol
do
        echo "${protocol}://${ip_address}:$username@$pwd/control/configinfo"
done < test_file1.txt

これにより、ソリューションよりもメンテナンスが容易になりますawk

関連情報