저는 운영 체제 과정을 위한 쉘 스크립트를 작성하려고 합니다. 하지만 파일의 내용을 읽을 수는 없습니다. 질문에 대한 답변으로 제가 입력한 내용만 읽은 것 같습니다. 내가 무엇을 놓치고 있는지 잘 모르겠습니다(매우 간단합니다). 미리 감사드립니다.
echo "what file do you want to count? "
read file
mystring=$file
for token in $mystring;
do
echo -n "lines: ";
echo -n $token | wc -l;
echo -n "words: ";
echo -n $token | wc -w;
echo -n "chars: ";
echo -n $token | wc -c;
done
답변1
여러분이 작성하는 스크립트는 해당 파일 이름에 해당하는 파일의 줄 수 등이 아니라 사용자가 입력한 문자열의 줄 수 등을 계산합니다.
다음은 원하는 작업을 수행하고 파일이 존재하지 않거나 일반 파일이 아닌 경우 오류 메시지를 표시하는 스크립트입니다.
#!/bin/sh
echo "Enter filename"
read fname
if [ ! -f "$fname" ]; then
echo "No such file!" >&2
exit 1
fi
lines=$( wc -l <"$fname" )
words=$( wc -w <"$fname" )
chars=$( wc -c <"$fname" )
printf 'The file "%s" has %d lines, %d words and %d characters\n' \
"$fname" "$lines" "$words" "$chars"
wc
세 번 호출하는 것을 방지하려면 다음을 수행하세요 .
#!/bin/sh
echo "Enter filename"
read fname
if [ ! -f "$fname" ]; then
echo "No such file!" >&2
exit 1
fi
printf 'The file "%s" has %d lines, %d words and %d characters\n' \
"$fname" $( wc <"$fname" )
이는 기본 출력이 행, 단어 및 문자 수라는 사실을 활용합니다 wc
. 이렇게 출력하고 싶다면 그것으로 충분합니다.
답변2
이 코드는 파일의 내용을 읽지 않습니다. 스크립트에서 수행하는 작업은 사용자로부터 파일 이름을 가져온 다음 이를 변수( $file
및 이후 $mystring
)에 저장하는 것입니다.
를 실행하면 for token in $mystring
변수의 내용이 목록으로 표시되지만 $mystring
사용자가 입력한 파일 이름만 표시됩니다. 따라서 참조된 모든 명령은 $token
사용자로부터 얻은 문자열을 기반으로 작동됩니다.
파일 내용을 조작하려면 cat
@faadi: 지적한 대로 사용할 수 있습니다 mystring=$(cat $file)
.
편집하다:
답변에서 뭔가를 수정하면 됩니다. 내 우려는 당신이 문서를 읽지 못했고 @steeldriver가 그의 의견에서 제기한 또 다른 문제를 해결하지 못했다는 것입니다. 행을 에서 로 변경하면 mystring=$file
결국 mystring=$(cat $file)
파일 내용을 목록으로 분할하고 wc
해당 내용을 실행하게 되므로 원하는 효과를 얻을 수 없습니다.
for 루프를 제거하고 이것을 사용할 수 있습니다(텍스트를 변수에 저장하고 사용하려는 경우 echo
).
#!/bin/bash
echo "File to read:"
read file
mystring=$(cat $file)
echo ""
echo "TEXT:"
echo "$mystring"
echo ""
echo -n "Lines: "
echo "$mystring" | wc -l
echo -n "Words: "
echo "$mystring" | wc -w
echo -n "Chars: "
echo "$mystring" | wc -c
또는 @steeldriver가 제안한 대로 wc
다음과 같이 파일을 STDIN으로 리디렉션하세요.
#!/bin/bash
echo "File to read:"
read file
echo ""
echo "TEXT:"
cat $file
echo ""
echo -n "Lines: "
wc -l < $file
echo -n "Words: "
wc -w < $file
echo -n "Chars: "
wc -c < $file