我有一个名为school.test的文件,它看起来像这样:
David maths
Sam maths
Sam english
Simon french
Simon english
我想写一个for循环,逐行读取这个txt文件,并将在该行读取的值分配给不同的变量并通过命令运行它。问题是我不知道如何将第一个值设置为变量,将第二个值设置为不同的变量。
例如对于第一行,for循环读取它看起来像这样:
for line in `cat/home/school.test`
do
positionClient -name [variable=David] -class [variable=math]
done
依此类推。我该怎么做呢?
答案 0 :(得分:3)
$ while read name subject
> do
> echo "Name: $name, Subject: $subject"
> done <<< 'David maths
> Sam maths
> Sam english
> Simon french
> Simon english'
Name: David, Subject: maths
Name: Sam, Subject: maths
Name: Sam, Subject: english
Name: Simon, Subject: french
Name: Simon, Subject: english
当你想做真实的事情时,只需从文件而不是字符串重定向。
答案 1 :(得分:3)
您可以使用内置read
:
cat /home/school.test | while read name class ; do
positionClient -name "$name" -class "$class"
done
我更喜欢使用cat
的管道,因为使用带有while
循环的I / O重定向看起来有点奇怪(&#34; done
对此文件做什么?& #34):
while read name class ; do
positionClient -name "$name" -class "$class"
done < /home/school.test
请注意,如果要在循环后在循环体和代码之间共享变量,则必须使用第二种方法。使用管道时,while
循环将在子shell中执行(在不同的进程中),并且当循环结束时,对循环内变量的所有修改都将丢失。
答案 2 :(得分:-1)
有多种方法可以将值转换为不同的变量。在其他答案中已经提到了一种方法,即使用内置的read
。
请允许我解释另一种方法。以下是使用awk
的一种方法。它可能不是最优的(因为子shell事物),但它可以工作。
for line in `cat school.test`
do
name=`echo $line | awk '{print $1}'`
class=`echo $line | awk '{print $2}'`
positionClient -name "$name" -class "$class"
done