저는 메뉴 기반 bash 스크립트를 작성 중이며 메뉴 옵션 중 하나는 텍스트 파일 첨부가 포함된 이메일을 보내는 것입니다. 내 파일이 텍스트 파일인지 확인할 수 없습니다. 이것이 내가 가진 것입니다:
fileExists=10
until [ $fileExists -eq 9 ]
do
echo "Please enter the name of the file you want to attach: "
read attachment
isFile=$(file $attachment | cut -d\ -f2)
if [[ $isFile = "ASCII" ]]
then
fileExists=0
else
echo "$attachment is not a text file, please use a different file"
fi
done
오류가 계속 발생합니다. 구분 기호는 단일 문자여야 합니다.
답변1
file $attachment
대신 이라는 사실로 판단하면file "$attachment"
귀하의 스크립트가 공백이 포함된 파일 이름을 처리할 수 없는 것 같습니다. 그러나 파일 이름에는 공백이 포함될 수 있으며 잘 작성된 스크립트를 사용하면 이를 처리할 수 있습니다. 그런 다음 참고하세요:$ file "foo bar" foo bar: ASCII text $ file "foo bar" | cut -d' ' -f2 bar:
널리 사용되며 적극 권장되는 방법은 파일 이름을 null로 종료하는 것입니다.
$ file -0 "foo bar" | cut -d $'\0' -f2 : ASCII text
이
file
명령은 파일의 파일 형식에 대해 정보를 바탕으로 추측합니다. 물론 추측이 틀릴 때도 있다. 예를 들어,file
때때로 일반 텍스트 파일을 보고 그것이 쉘 스크립트, C 프로그램 또는 다른 것이라고 추측합니다. 따라서 출력이 있는지 확인하고 싶지 않습니다.file
예ASCII text
, 당신이 알고 싶은 것은설명하다파일은 텍스트 파일입니다. 매뉴얼 페이지를 보면 파일이 텍스트 파일인 경우 출력에 해당 단어가 포함된다는file
것을 알 수 있지만 . 출력에는 다음 단어가 포함됩니다 .text
shell commands text
file
text
isFile=$(file -0 "$attachment" | cut -d $'\0' -f2) case "$isFile" in (*text*) echo "$attachment is a text file" ;; (*) echo "$attachment is not a text file, please use a different file" ;; esac
답변2
case $(file -b --mime-type - < "$attachment") in
(text/*)
printf '%s\n' "$attachment is probably text according to file"
case $(file -b --mime-encoding - < "$attachment") in
(us-ascii) echo "and probably in ASCII encoding"
esac
esac
답변3
. cut -d\ -f2
로 변경 하면 문제가 발생합니다 .cut -d\ -f2
의 경우 cut
매개변수는 다음과 같습니다.
# bash: args(){ for i; do printf '%q \\\n' "$i"; done; }
# args cut -d\ -f2
cut \
-d\ -f2 \
그것이 문제이다. \
셸에서 인수 사이의 구분 기호가 아닌 공백 리터럴로 공백을 이스케이프하고 추가 공백을 추가하지 않아 전체 -d\ -f2
부분이 하나의 인수로 표시됩니다. 추가 공백을 추가하여 두 개의 매개변수로 표시해야 -d\
합니다 -f2
.
혼란을 피하기 위해 많은 사람들이 대신 따옴표를 사용합니다 -d' '
.
추신: 파일을 사용하는 것보다 차라리 파일을 사용하고 모든 것을 ASCII로 설정하고 싶습니다.
if file "$attachment2" | grep -q text$; then
# is text
else
# file doesn't think it's text
fi
답변4
또 다른 옵션은 정규식을 사용하지 않고 cut
다음 전체 출력과 일치시키는 것입니다 file
.
#...
isFile=$(file $attachment)
if [[ "$var" =~ ^[^:]*:\ ASCII ]]
#...