두 개의 변수로 사용자로부터 입력을 받는 스크립트가 있습니다. 그런 다음 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
이 경우 다음을 수행하여 이를 수행할 수 있습니다.
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 -l
도 ls / | 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을 배열로 확장하고 요소 수를 계산하는 것이 좋습니다.