$# 및 루핑을 사용하여 스크립트를 처리하는 데 문제가 있습니다.

$# 및 루핑을 사용하여 스크립트를 처리하는 데 문제가 있습니다.

다음 스크립트가 있습니다.

    #!/bin/bash
    for ((i=1; i<=$#; i++));
    do
       if [ ! -d $i ]
       then
          echo $i its not a directory >> file.txt
       else
          DIRECTORY=$(ls -l $i | grep ^d | wc -l)
          LINK=$(find $i -type l | wc -l)
          FILE=$(ls -A $i | wc -l)

          echo `date "+%H:%M:%S %d-%m-%y"` directory $i file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt

       fi
    done

스크립트는 인수로 입력된 디렉터리의 하위 디렉터리, 링크 및 파일 수를 계산합니다(1을 초과할 수 있음).

"echo $i 디렉토리가 아닙니다"를 반환하고 $1 대신 $i를 1로 읽는 루프로 인해 어려움을 겪고 있습니다. 왜 이렇게 하는지 이해하지만 스크립트로 시작하고 수정 방법을 모릅니다. 이것 . "while"이 "for"를 대체할 수 있다고 생각하지만 올바르게 사용하는 방법을 모르겠습니다.

도와주셔서 감사합니다!

답변1

1부터 [인수 수]까지 반복한 다음 각 숫자가 실제로 디렉터리인지 테스트합니다. 다음을 수행하는 것이 더 쉬울 수 있습니다.

#!/bin/bash
for item in "$@"; do  # iterate over the arguments themselves
    if [[ ! -d "$item" ]]; then
        echo "$item is not a directory" >> file.txt
    else
        DIRECTORY=$(ls -l $item | grep ^d | wc -l)
        LINK=$(find $item -type l | wc -l)
        FILE=$(ls -A $item | wc -l)

        echo `date "+%H:%M:%S %d-%m-%y"` directory $item file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt
    fi
done

답변2

당신이 원하는 것은 변수 간접 참조입니다 - 당신은 그 변수를 참조하고 싶습니다이름다른 변수에 저장됩니다. 가능합니다 . 대신 bash인용하면 됩니다 ."${!i}"$i

또한 참고하시기 바랍니다변수 주변의 큰따옴표의 중요성.

즉... 스크립트를 크게 단순화할 수 있습니다. 예를 들어,이것은 선이다이는 스크립트로 수행하려는 거의 모든 작업을 수행합니다.

관련 정보