bash 스크립트 사용자에게 디렉토리 경로를 인수로 전달하도록 요청하고 싶습니다. 다음 중 좋은 프로그래밍 방법은 무엇입니까?
- 사용자가 후행 / (슬래시)를 입력해야합니다.
- 사용자가 후행 / (슬래시)를 입력하지 않아야합니다.
ls -l dir
와 다르게 행동 한다는 것 입니다. ls -l dir/
dir
bash 스크립트 사용자에게 디렉토리 경로를 인수로 전달하도록 요청하고 싶습니다. 다음 중 좋은 프로그래밍 방법은 무엇입니까?
ls -l dir
와 다르게 행동 한다는 것 입니다. ls -l dir/
dir
답변:
모범 사례는 둘 다 가정하지 않는 것입니다.
경로 작성기 유틸리티 / 클래스에 액세스 할 수있는 경우이를 사용하여 코드를 작성하지 않으면 형식 중 하나를 수락하고 그에 따라 조치를 취하십시오.
후행 슬래시를 추가할지 여부를 기억하는 것보다 사용자에게 더 성가신 것은 없습니다.
dirname
, basename
그리고 readlink
. 가장 일반적인 문제는 ${path##*/}
의 대체물로 사용 basename
되지만 경로가 슬래시로 끝나는 경우 마지막 경로 요소 대신 빈 문자열을 반환합니다.
rsync
내가보고 있습니다)
${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
나는 또한 명확성을위한 요점에 문서화 : 추가 또는 bash는 후행 슬래시 제거
bash는 여러 슬래시를 무시하므로 사용자가 경로에 슬래시를 입력하지 않고 슬래시를 직접 추가했다고 가정 할 수 있습니다.
cat /etc/hosts
같은
cat /////etc//////////hosts
따라서 스크립트는 다음과 같습니다.
echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
echo "found myfile!"
else
echo "nope"
fi
사용자가 경로에 /를 입력했는지 여부를 걱정할 필요가 없습니다.
bash
행동 이 아닙니다 , 커널은 그것을합니다.
rsync
다르게 매우 중요한 방식으로 동작이 후행의 존재에 따라/
, 그래서 어떤 경우에는 당신은 일관성을 정상화 할 것, 그리고 다른 사람에 당신은 사용자가 무엇을 구현하기 위해 깨끗하게 통과 싶어 했다 (그들이 경우 그들이 말하고 있다는 것을 알았습니다rsync
).