【问题标题】:Variable assignment when reading from file using cat使用 cat 从文件中读取时的变量赋值
【发布时间】:2015-02-11 05:10:29
【问题描述】:

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

这段代码实际上是逐字读取文件,它在if语句的thenelse之间交替。一旦它为变量名(then 部分在 if 中)分配了一个已读取的值,然后它会在 else中执行的命令中使用该变量> 如果的一部分。 (这就是我希望它工作的方式。)

出现的问题是 ifthen 部分中的变量赋值似乎不起作用,它看到它刚刚作为命令读取的单词,并且没有赋值其值为变量。我试图回应它,它工作得很好。

为什么name= $line 变量赋值不起作用?

感谢您的任何建议、cmets 或答案。

【问题讨论】:

    标签: bash file cat


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢您提供详细的回答,并提供清晰具体的解释...我更改了代码并学习了新事物...您提供了帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多