【问题标题】:Reading lines from a file into variables in Bash将文件中的行读入 Bash 中的变量
【发布时间】:2019-08-22 12:53:27
【问题描述】:

我正在创建一个脚本以使用 Bash 从 Unix 中的文本文件自动添加用户

我已将文件读入 $FILE 中保存的脚本中

文件格式如下: 电子邮件;生日;群组;共享文件夹

我想忽略文件中的第一行并将数据读入变量

我已经将 IFS 设置为 ';'早些时候。目前我有

sed 1d $FILE | while read EMAIL BIRTH GROUPS SHAREDFOLDER
do
echo "$EMAIL"
done < $FILE

但是当我回显 EMAIL 变量时,我什么也得不到

【问题讨论】:

    标签: bash unix


    【解决方案1】:

    您正在尝试重定向标准输入两次。管道和&lt; 不能都连接到while read。在我的 Bash 上,&lt; 获胜:

    bash$ echo moo | cat <<<bar
    bar
    

    显然你想要的只是

    sed 1d "$FILE" | while read -r EMAIL BIRTH GROUPS SHAREDFOLDER
    do
        echo "$EMAIL"
    done
    

    虽然这可以有意义地减少到只是

    sed 1d;s/;.*//' "$FILE"
    

    你也很想use lower case for your private variables,但这是一个单独的讨论。

    【讨论】:

    • 由于某种原因,即使使用您的方法,我仍然没有得到 echo 的输出。如果我只在我的读取语句中添加一个变量,然后回显该变量,它会回显每一行。这几乎就像 IFS 没有在“;”上拆分
    • @Ali97 sed '1d;s/;.*//' "$FILE" 有输出吗?
    • 或者你想访问循环外的变量?这在许多情况下都行不通;见mywiki.wooledge.org/BashFAQ/024
    • 我不确定问题的原因是什么,但是使用完全相同的语句,如果我将变量更改为小写,它工作得非常好。我会将这个答案标记为正确,因为它是最全面的,并且确实提到了变量是小写的
    • 刚刚看到有个环境变量叫“GROUPS”。他们可能正在发生冲突。我认为这就是为什么私有变量应该是小写的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2020-09-30
    • 2013-09-15
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多