Shell
讀取文本文件並將資訊儲存到變數中
我有一個文本文件,其中的記錄採用以下任何一種格式:
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
返回失敗,它將繼續進行下一部分。這就是為什麼 nextecho
,循環外的那個按預期工作。