스크립트 실행 시 매개변수를 처리하는 방법
내 코드는 다음과 같습니다
#!/bin/bash
DIR="$1"
if [ DIR eq $1 ]
then
echo -n "total directories:" ; find $DIR -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
echo " pass parameters"
fi
스크립트 이름( )을 사용하여 실행하면 ./countfiledirs
다음과 같이 읽습니다.
./countfiledirs: line 4: [: DIR: unary operator expected
pass parameters
매개변수를 전달하지 않고 실행 하면 ./countfiledirs
다음과 같이 표시됩니다.
pls pass arguments.
./countfiledirs를 실행하고 인수를 ./countfiledirs /usr/share로 전달하면 다음과 같은 출력이 표시됩니다.
total directories:145
total files:254
답변1
오류는 다음과 같습니다.
if [ DIR eq $1 ]
변수를 사용하지 않고 간단한 string 입니다 DIR
. 당신이 원하는 것은 :
if [ "$DIR" = "$1" ]
그러나 이를 설정하고 있으므로 DIR="$1"
정의에 따라 이 테스트는 항상 true입니다. 또한 $1
비어 있으면 현재 디렉터리에서도 $DIR
명령이 find
실행됩니다. 많은 버전의 에서 find
다음 명령은 동일합니다.
find . -name foo
find -name foo
대상 디렉터리가 없으면 현재 디렉터리를 find
검색합니다 .
. 따라서 스크립트의 작업 버전은 다음과 같습니다.
#!/bin/bash
## Avoid using UPPER CASE variable names in bash.
dir="$1"
## Check if $dir exists
if [ -e "$dir" ]
then
printf "total directories: %s\n" $(find "$dir" -type d | wc -l)
printf "total files: %s\n" $(find "$dir" -type f | wc -l)
else
echo " pass parameters"
fi
Bash 스크립트에 전달된 인수 수는 다음 $#
과 같이 저장됩니다.
if [ $# -lt 1 ]
then
echo "pass parameters"
exit
fi