Bash 스크립트가 예상대로 인쇄되지 않습니다. 내 스크립트에 어떤 문제가 있나요?

Bash 스크립트가 예상대로 인쇄되지 않습니다. 내 스크립트에 어떤 문제가 있나요?

인수를 읽고 디렉터리, 일반, 실행 파일 또는 기호 링크 파일인지 테스트하고 터미널에서 인쇄하는 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이 딱 들어맞았습니다. 제가 확장하고 싶은 유일한 말은 항상 원하는 결과에 대한 에코와 그 주위에 더 나은 기능을 구축하는 것입니다.

간단히 말해서 먼저 작동하는지 확인한 다음 더 잘 작동하도록 만드세요.

관련 정보