다음 형식의 레코드가 포함된 텍스트 파일이 있습니다.
SCI.txt
12-12-1990
12-12-1991
CSE Department
또는
12-12-1990,12-12-1991,CSE Department
3개의 변수에 저장하고 싶습니다.
a,b,c
txt 파일을 읽고 쉘 스크립트(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
는 루프가 실행되지 않기 때문입니다. 문자가 발견되지 않으면 0이 아닌(실패) 종료 상태를 반환합니다 read
. 성공할 때마다 구성이 실행됩니다. 실패 로 인해 루프가 실행되지 않으며 루프 내부도 실행되지 않습니다. 대신 스크립트는 명령을 실행하고 변수를 할당한 후 실패가 반환되므로 다음 섹션으로 계속 진행됩니다. 이것이 바로 다음 항목(루프 외부 항목)이 예상대로 작동하는 이유입니다.\n
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