명령에서 사용자 정의 변수를 사용하는 경우 조건을 만드는 방법

명령에서 사용자 정의 변수를 사용하는 경우 조건을 만드는 방법

두 개의 변수로 사용자로부터 입력을 받는 스크립트가 있습니다. 그런 다음 if의 조건에 입력되는 명령에서 이러한 변수를 사용하려고 합니다. 그러나 사용자 입력 값이 내 변수를 대체하지 않으므로 내 명령이 작동하지 않습니다.

# Get acl and dc values
echo "Type the ACL name:"
read acl
echo "Type the DATACENTER name"
read dc
# see if sw-list-cisco file exists in ~/$acl directory"
if [ ` ls -1 ~/$acl/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
then
    echo "Going to do something"
else
     echo "no match !!!!!!!!!!!!!"
fi

조건 이 if [ ` ls -1 ~/"$acl"/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];$acl을 사용자 입력 값으로 대체하지 않는 것 같습니다. sw-list-cisco디렉토리에 존재하는지 수동으로 확인했습니다 ~/$acl. 내가 무엇을 놓치고 있나요?

답변1

구문 분석이 필요한 경우는 거의 없습니다.ls.

이 경우 다음을 수행하여 이를 수행할 수 있습니다.

if [ -f "$HOME/$acl/sw-list-cisco" ]; then

-f주어진 이름이 존재하고 일반 파일의 이름인지 테스트하기 위해 테스트를 사용하고 있습니다 . $HOME대신에 사용하고 있어요 ~왜냐하면~따옴표 안의 변수가 아님(좀 $HOME더 설명하자면, IMHO).

답변2

if [ ` ls -1 ~/$acl/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];

ls/dev/null아무 일도 일어나지 않도록 출력을 로 리디렉션하고 wc항상 인쇄합니다 0. 수동으로 시도해 ls / >/dev/null | wc -lls / | wc -l마찬가지입니다 .

리디렉션을 원할 수도 있습니다.실수에서 로 ls변경 /dev/null:

if [ $(ls ~/"$acl/sw-list-cisco" 2>/dev/null | wc -l) -gt 0 ];

( -1출력이 파이프로 들어가는 경우에는 필요하지 않습니다.)

하지만 파일이기 때문에 [ -f ~/"$acl/sw-list-cisco" ]더 쉽게 할 수 있습니다@Kusalananda가 이미 답변했습니다.. 파일 수를 계산하려는 경우에도 glob을 배열로 확장하고 요소 수를 계산하는 것이 좋습니다.

관련 정보