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 要简单得多,因为它将行输入到指定的变量。这是一种方法:

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 回答