在for循环中分配变量

时间:2015-04-28 12:45:24

标签: bash shell loops unix scripting

我有一个名为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

依此类推。我该怎么做呢?

3 个答案:

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