다음 스크립트가 있습니다.
#!/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
또한 참고하시기 바랍니다변수 주변의 큰따옴표의 중요성.
즉... 스크립트를 크게 단순화할 수 있습니다. 예를 들어,이것은 선이다이는 스크립트로 수행하려는 거의 모든 작업을 수행합니다.