1

事前にご協力いただきありがとうございます。ファイルの各行を読み取り、各行を別の変数に格納する単純な bash スクリプトを作成しています。たとえば、スクリプトで次のコマンドを実行したいと考えています。

d1=AER
d2=BHR
d3=CEF
...

したがって、10 行のテキスト ファイルがあり、各行は保存したい変数 (AER など) の内容であり、次の test.sh スクリプトがあります。

#!/bin/bash
for i in {1..10..1}
do
    $(d$i=$(sed -n ${i}p $HOME/textfile.txt))
done

ただし、スクリプトを実行すると、

./test.sh: line 4: d1=AER: command not found
./test.sh: line 4: d2=BHR: command not found
./test.sh: line 4: d3=CEF: command not found
...

、対応する変数に文字を格納する代わりに。誰かが私がどこを間違えたのか特定してもらえますか? どうもありがとう!

4

3 に答える 3

6

スクリプトの問題は、最初の行で変数を補間する必要がある場合、bash がそれをプログラムの名前と見なして実行しようとすることです。変数を作成するために、それを評価できます。

eval "d$i=$(sed ...)"

ただし、指定された変数への行入力を受け取るため、read bash ビルトインを使用する方がはるかに簡単です。これを行う1つの方法は次のとおりです。

for ((i=1;; i++)); do
    read "d$i" || break;
done < textfile.txt
echo "$d1"
echo "$d2"
于 2012-07-26T21:30:54.473 に答える
4

配列を使用しますが、正しい方法です。

read -a d -d '\n' < textfile.txt
echo "${d[1]}"
于 2012-07-26T21:16:39.763 に答える
0

配列ソリューションの代わりに、 を使用できますeval

((lnum=1))
exec 3< ${filetoread}
while read -u3 line
do
  eval `echo d${lnum}=\"${line}\"`
  ((lnum=1+${lnum}))
done
exec 3<&-
于 2012-07-26T21:37:39.077 に答える