인수를 읽고 디렉터리, 일반, 실행 파일 또는 기호 링크 파일인지 테스트하고 터미널에서 인쇄하는 BASH 스크립트를 만들려고 합니다.
내 스크립트를 실행할 때 "./myscript.bash *"를 사용하여 확인하지만 예상 결과를 얻지 못합니다. 내 홈 디렉토리에 있는 모든 항목의 이름이 "찾을 수 없음"으로 표시됩니다. 예:
"데스크톱을 찾을 수 없음" "다운로드를 찾을 수 없음" 등은 내 홈 폴더에 있고 디렉터리에 있더라도 마찬가지입니다. 내가 뭘 잘못하고 있는지 아는 사람 있나요?
#!/bin/bash
for i in $*; do
if [ -d “{$i}” ]; then
echo “${i} (Directory)”;
elif [ -x “{$i}” ]; then
echo “${i} (Executable)”;
elif [ -h “{$i}” ]; then
echo “${i} (Symbolic)”;
elif [ -f “{$i}” ]; then
echo “${i} (Ordinary)”;
else
echo “${i} not found”
fi
done
답변1
간단한 스크립트 디버깅의 첫 번째 규칙:
작동하지 않으면 에코를 시도해 보세요.
이 경우:
for i in $*; do
echo "testing if “{$i}” exists"
if [ -d “{$i}” ]; then
echo “${i} (Directory)”;
<... rest of the script ...>
응답이 다음과 같은 것을 즉시 확인할 수 있습니다.
testing if “{Downloads}” exists
...
즉, 테스트는 "{Downloads}"(smartquotes-accolade open-Downloads-accolade close smartquotes)가 존재하는지 여부입니다.
해당 디렉토리는 아마도 존재하지 않을 것입니다.
스마트쿼트는 초보 쉘 스크립터의 실수일 수 있습니다. Bash(및 대부분의 다른 쉘)는 따옴표 사용에 매우 까다롭습니다. 작은따옴표( '
)는 큰따옴표( "
)와 의미가 다릅니다. 역따옴표도 다른 의미를 갖습니다. 똑똑한 인용문은 어머니가 주신 것입니다. 아무것도 하지 마십시오(제퍼슨 비행기에 대한 언급을 용서하신다면). 여기서는 큰따옴표( "
)를 사용해야 합니다. 변수 확장이 가능하기 때문입니다.
다음은 {
및 입니다 }
. echo
'에는 다음을 제공합니다.
echo “${i} not found”
하지만 그 if
안에는 {$i}
. 차이를 발견. 사용한 경우
if [ -d "${i}" ]; then
그것은 효과가 있었을 것입니다.
Kamil은 자신의 의견에 다음과 같이 썼습니다.
당신은 거의 원하지 않습니다
$*
. 당신은 거의 항상"$@"
대신 원합니다.
그리고 그가 옳습니다. $*
및 의 차이점을 설명하는 전체 페이지가 있지만 "$@"
차이점을 보여주는 가장 간단한 방법은 다음과 같습니다.
#!/bin/bash
echo ------------------
echo '$*'
for i in $* ; do echo $i ; done
echo ------------------
echo '"$@"'
for i in "$@" ; do echo $i ; done
echo ------------------
(저는 이 스크립트를 호출했습니다 a
) 다음을 사용하여 실행합니다.
bash a 'plop 123' plop 123
------------------
$*
plop
123
plop
123
------------------
"$@"
plop 123
plop
123
------------------
답변2
@ljm이 딱 들어맞았습니다. 제가 확장하고 싶은 유일한 말은 항상 원하는 결과에 대한 에코와 그 주위에 더 나은 기능을 구축하는 것입니다.
간단히 말해서 먼저 작동하는지 확인한 다음 더 잘 작동하도록 만드세요.