读取文本文件并将信息存储到变量中

读取文本文件并将信息存储到变量中

我有一个文本文件,其中的记录采用以下任意一种格式:

SCI.txt

12-12-1990
12-12-1991
CSE Department

或者

12-12-1990,12-12-1991,CSE Department

我希望它们存储在 3 个变量中

a,b,c

我正在寻找读取 txt 文件并使用 shell 脚本(ksh)将值存储到变量中。

- - 更新 - -

我几乎尝试了互联网上可用的所有方法。我无法让他们工作。

现在我正在尝试这个方法。

#!/usr/bin/ksh
#reading the file content and storing in variable
_input="sci.txt"
while IFS='|' read -r fdate rdate dcname
do
   echo "$fdate $rdate $dcname"
done < "$_input"

sci.txt内容如下

demo1|demo2|demo3

但我没有得到上述方法的任何输出。

答案1

看起来并sci.txt没有以新行字符结束。如 中所述man kshread内置函数默认读取第一个换行符:

  read [ -ACSprsv ] [ -d delim] [ -n n] [ [ -N n] [ [ -t  timeout]  [  -u
   unit] [ vname?prompt ] [ vname ... ]
          The  shell  input  mechanism.  One line is read and is broken up
          into fields using the characters  in  IFS  as  separators.   The
          escape  character,  \, is used to remove any special meaning for
          the next character and for line  continuation.   The  -d  option
          causes  the  read  to  continue  to the first character of delim
          rather than new-line.

因此,除非您使用-d,否则它将寻找换行符。如果您的文件没有,它实际上不会读取任何内容。为了显示:

$ printf 'demo1|demo2|demo3\n' > sci.newline
$ printf 'demo1|demo2|demo3' > sci.nonewline

$ cat foo.sh
#!/usr/bin/ksh
for file in sci.newline sci.nonewline; do
    echo "Running on: $file"
    while IFS='|' read -r fdate rdate dcname
    do
        echo "$fdate $rdate $dcname"
    done < "$file"
done

运行此脚本会返回预期输出,sci.newline但不会返回sci.nonewline

$ foo.sh < sci.nonewline 
Running on: sci.newline
demo1 demo2 demo3
Running on: sci.nonewline

因此,如果您的文件以换行符 ( \n) 结尾,则一切都应按预期工作。


现在,您的语句在循环之外工作的原因echo是因为循环甚至从未运行。当read没有遇到\n字符时,它返回非0(失败)退出状态。while SOMETHING; do只要SOMETHING成功,该构造就会运行。因为read失败,循环永远不会运行,echo循环内部也不会执行。相反,脚本将运行read命令并分配变量,然后,由于read返回失败,它将继续到下一部分。这就是为什么下echo一个(循环外的那个)按预期工作。

答案2

while IFS=" ," read a b c; do
    echo a: $a b: $b c: $c
done < SCI.txt

相关内容