我有一个文本文件,其中的记录采用以下任意一种格式:
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 ksh
,read
内置函数默认读取第一个换行符:
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