我有一个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
变量分配不起作用?
感谢您提出任何建议,意见或答案。
答案 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