Shell

讀取文本文件並將資訊儲存到變數中

  • August 18, 2016

我有一個文本文件,其中的記錄採用以下任何一種格式:

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

但我沒有得到上述方法的任何輸出。

它看起來不像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返回失敗,它將繼續進行下一部分。這就是為什麼 next echo,循環外的那個按預期工作。

引用自:https://unix.stackexchange.com/questions/304203