Bash:在一个操作中分配许多变量

时间:2013-01-17 15:49:10

标签: bash

我有一个像

这样的文件
line1 word1 word2 word4 etc..
line2 word1 word2 word4 etc..

我知道我可以使用cut -d ' ' -fx命令提取单词,但我想在一次操作中提取和分配多个单词。

while read line;do
  echo $line | awk '{ word1=$1; word2=$2 }'
  # usage $word1, $word2, etc.
done < $file 

这可能吗?

更好的例子

文件
jose  1234 2011/12/01
maria 2345 2010/04/10
脚本
while read line;do
  echo $line | awk '{ name=$1; counter=$2, date=$3 }'
  # usage $name, $counter, $date, etc
done < $file 

2 个答案:

答案 0 :(得分:6)

如果一行中的单词数是固定的(简单情况),那么:

while read name number date
do
    # ...use $name, $number, $date
done <<'EOF'
jose  1234 2011/12/01
maria 2345 2010/04/10
EOF

请注意,如果该行中有4个或更多单词,$date将获取姓名和号码后面的所有剩余单词。如果少于三个,read将有效,但没有值(datenumber或甚至name)的变量将为空字符串。

如果一行中的字数是可变的,那么您可能希望将bash arraysread一起使用:

while read -a array
do
    # ...process "${array[@]}"...
    echo "${array[@]}"
done <<'EOF'
one
two three
four five six
seven eight
nine
EOF

答案 1 :(得分:3)

可以使用awk

root@server$ vars=$( awk '{for(i=1;i<=NF;i++){ print "word" i "=" $i }}' file )
root@server$ echo $vars
word1=one word2=two word3=three
root@server$ declare $vars
root@server$ echo $word1 
one

所以细分

Awk有内部变量NF,它是行中的字段数。因此,我们在所有字段上运行快速for循环,跳过字段0作为整个行。对于每次迭代,我们打印出一个bash变量赋值语句,并将输出捕获到vars变量中。

然后我们使用declare来声明变量。如果我们不使用declare,那么我们在文件中执行一些任意代码。

希望这很有用。