Bash를 사용하여 텍스트 조작 스크립트를 실행하려고 합니다. 스크립트의 경우 다음 구문을 사용하여 입력용 텍스트 파일을 가져오고 싶습니다.
./my_Script.sh < filename
이런 식으로 파일에서 입력을 얻을 수 있습니까? 넣어보려고
'>' test.txt
스크립트의 첫 번째 줄에서 데이터를 읽으려고 시도했지만 수행한 작업은 빈 텍스트 파일을 만드는 것뿐입니다.
답변1
달성하려는 목표에 따라 다릅니다.
네가 원한다면각 행 처리입력 파일에서 다음을 수행할 수 있습니다.
#!/bin/bash
while read -r line; do
echo "Next line: $line"
# or something more useful.... :-)
done
그런 다음 설명하는 대로 이 스크립트를 호출할 수 있습니다.
./script.sh < input_file.txt
네가 원한다면파일 이름을 다른 도구에 전달다음을 수행할 수 있습니다.
#!/bin/bash
other_tool "$1"
다음과 같이 스크립트를 호출하십시오.
./script.sh input_file.txt
답변2
이 입력 리디렉션을 하드코딩하려면 다음 exec
명령을 사용하십시오.
exec < test.txt
그럼 넌 할 수 있어
while IFS= read -r line; do
echo "got: $line"
done
답변3
그리고
./script.sh <filename
스크립트의 표준 입력 전체를 파일에 추가합니다 filename
. 이것은 의미한다아무것스크립트의 표준 입력에서 읽는 것은 filename
파일 끝에 도달할 때까지 파일에서 읽혀집니다.
예를 들어, 위의 방식으로 호출하는 스크립트(모든 문자를 대문자로 변경)는 다음과 같이 작성할 수 있습니다.
#!/bin/sh
tr 'a-z' 'A-Z'
참고 filename
하시거나<filename
논쟁이 아니다스크립트의 명령이지만 파일에서 나오도록 스크립트의 표준 입력을 설정하는 쉘에 발행된 명령입니다.
반면에 다음을 사용하여 스크립트를 실행하면
./scripts.sh filename
그러면 파일 이름을 $1
스크립트에서와 같이 사용할 수 있으며 파일을 읽을 때 인용해야 합니다.
#!/bin/sh
tr 'a-z' 'A-Z' <"$1"
또는,
#!/bin/sh
filename=$1
tr 'a-z' 'A-Z' <"$filename"
이렇게 하면 동일한 파일을 여러 번 구문 분석할 수 있는 반면, 스크립트의 표준 입력을 통해 내용을 읽으면 파일을 한 번만 읽을 수 있습니다(예를 들어 스크립트의 임시 파일에 저장한 다음 cat >tmpfilename
구문 분석하는 데 사용하지 않는 한). .
명령줄에 스크립트 파일 이름을 지정하면 루프에서 원하는 수의 파일을 처리할 수도 있습니다.
#!/bin/sh
for pathname do
# code that processes "$pathname"
done