파일이나 디렉터리 이름을 인수로 사용하고 해당 파일이 디렉터리인지, 일반 파일인지, 아니면 다른 것인지 보고하는 Bash 스크립트를 작성하려고 합니다. 또한 스크립트는 사용자에게 파일이나 디렉터리에 대한 읽기, 쓰기 및 실행 권한이 있는지 여부도 보고해야 합니다.
분명히 다음과 같은 내용이 원본 메시지를 받게 됩니다.
#!/bin/sh
read -p "Enter a filename: " fname
file $fname
ls -la $fname
그러나 file 명령을 완전히 제거하고 filename 변수를 ls에 전달한 다음 결과에 따라 일종의 if, then, else 문을 작성할 수 있는지 궁금합니다. ls 명령은 파일 유형에 대한 완전한 분석과 명령을 실행하는 사용자가 파일에 대해 갖는 권한을 제공하므로 ls 명령의 결과에 따라 출력을 사용자 정의할 수 있습니까?
답변1
셸 테스트를 사용하여 파일 형식과 권한을 확인할 수 있습니다.
#!/bin/sh
read -rp 'Enter a filename: ' fname
if [ -f "$fname" ]; then
echo 'File is a regular file'
elif [ -d "$fname" ]; then
echo 'File is a directory'
else
echo 'File is not a regular file or a directory'
fi
[ -r "$fname" ] && read=read
[ -w "$fname" ] && write=write
[ -x "$fname" ] && execute=execute
echo "User has ${read} ${write} ${execute} permissions" | tr -s ' '
-f
if 구조는 파일 유형이 일반 파일( )인지 디렉토리( ) 인지 확인하여 파일 유형을 보고하고 -d
, 그렇지 않으면 둘 다 보고하지 않습니다.
-r
그런 다음 읽기( ), 쓰기( -w
), 실행( -x
) 등 다양한 권한을 확인합니다 . 각각에 대해 변수를 설정합니다. 사용자에게 이러한 권한 중 하나가 없으면 해당 변수는 설정되지 않은 상태로 유지되므로 사용자에게 해당 권한이 없으면 마지막 에코 줄에서 변수가 빈 상태로 확장됩니다. tr -s ' '
이는 존재하지 않는 권한에 존재할 수 있는 추가 공백 제거를 호출하여 최종적으로 수행 됩니다.