使用cat从文件读取时的变量赋值

时间:2014-12-12 13:16:27

标签: bash file cat

我有一个txt文件,格式如下:

name1    path/to/some/directory
name2    path/to/some/other/directory
name3    path/to/some/directory
name4    path/to/some/other/directory 
...

以下是我为逐行阅读此文件而编写的代码:

NUM=1
for line in $(cat /path/to/my/file.txt);  do
if [ $((NUM%2)) -eq 1 ]
then 
    name= $line #this line does not work
    echo $line #while this line works just fine

else 
    sudo tar -cf /desired/path/$name.tar $line
fi
NUM=$((NUM+1))
done

此代码实际上逐字读取文件,如果语句,它在 之间交替显示。一旦它分配了一个值,它已读取变量名称(然后部分,如果),那么它在 else if 的一部分。 (这就是我期望它发挥作用的方式。)

出现的问题是 中的变量赋值如果似乎不起作用,它会看到它刚刚读作命令的单词,并且不分配它的价值变量。我试图回应它,它工作得很好。

为什么name= $line变量分配不起作用?

感谢您提出任何建议,意见或答案。

1 个答案:

答案 0 :(得分:4)

bash中的分配不需要=周围的空格。

因此,您需要说:

name="$line"
     ^     ^
     quotes!

这是因为声明后发生的任何事情都被视为命令。请参阅此示例,尝试将r定义为2,然后执行echo 1

$ r=2 echo 1
1

这就是为什么引用声明也是一件好事:name="$line"


关于文件变量的解析和定义,您可以使用这种方法:

declare $('s/\s\+/="/; s/$/"/' a)

这会将第一个和第二个单词之间的空格替换为=",将行尾替换为"。这样,name /path/就会转换为name="/path/"。通过使用declare,此命令将被执行并使变量可供使用。

$ cat a
name1 aa
name2 rr
name5 hello
$ sed 's/\s\+/="/; s/$/"/' a
name1="aa"
name2="rr"
name5="hello"
$ declare $('s/\s\+/="/; s/$/"/' a)

现在您已准备好使用变量:

$ echo "$name5"
hello

最后,请注意,这与for line in $(cat /path/to/my/file.txt)相同(并且更好):

while IFS= read -r val1 val2 ...
do
    ... things ...
 done < /path/to/my/file.txt