変数とその値をファイルに出力する方法

変数とその値をファイルに出力する方法

これを行うのは少し難しいです。たとえば、forループを使用して変数値をファイルに送信する単純なループを作成できますか?しかし、変数の値を出力する前に何かを取得する方法は何ですか?解決策として、次のことを行いました。

list="$1\n$2\n$3"
varNames=$'var1=\nvar2=\nvar3='


for i in $varNames $list; do
    echo -e $varNames$list > "vars-$(date +%Y-%m-%d_%H.%M).file"
done

ただし、両方のリストの各項目を正しく繰り返すループを取得することはできませんが、結果は次のようになります。

var1= var2= var3=$1
$2
$3

上記の$1、$2、$3は、私が先ほど作成した変数の正確な値です。このループで私は何を見逃していますか? 2つのリストを作成するのは良いアプローチですか、それとも後でいくつかのsedで処理できますか?

ありがとうございます!

ベストアンサー1

スクリプトには、ほぼスクリプトの行数と同じくらい多くの問題があり、各ステップで他のすべてが期待どおりに機能すると仮定し、問題を1つずつ解決しようとします。

1.

list="$1\n$2\n$3"

\n改行が置き換えられないため、機能しません。次のようなものが必要です。

list="$1"$'\n'"$2"$'\n'"$3"

または

list="$1
$2
$3"

2.

for i in $varNames $list; do

(1)を修正すると仮定すると、ループは6回実行されます(免責事項、最後の文を参照)。$varNamesそしてそれぞれ一度$list、意図したものではないと思います。また、このように繰り返すと、変数は改行で区切られず、次のように区切られます。$IFS。デフォルトは改行、スペース、タブです。したがって、有効ですが、これを知るとlist="$1 $2 $3"(1)で使用することもできます。もちろん、これは各変数に改行、スペース、またはタブが含まれていないことがわかっている場合にのみ機能します。

三。

echo -e $varNames$list

分割された部分だけでなく、変数全体を出力します$i

4.

繰り返すたびにファイル全体が上書きされます。より良い使用

for ...; do ... done > file

だから今どうですか?

コードをそのまま簡単に修正することはできないと思います。代わりにbash配列を使用してキーを繰り返す必要があります。

#!/bin/bash

list=("$1" "$2" "$3")
varNames=("var1" "var2" "var3")

for k in "${!varNames[@]}"; do
    printf '%s=%s\n' "${varNames[$k]}" "${list[$k]}"
done > "vars-$(date +%Y-%m-%d_%H.%M).file"

printf(これを見てecho) でも構いませんので、このように使っても構いません。

echo "${varNames[$k]}=${list[$k]}"

おすすめ記事