변수가 포함된 명령의 출력을 배열로 리디렉션

변수가 포함된 명령의 출력을 배열로 리디렉션

여러 사용자 입력 변수가 포함된 명령의 출력을 배열로 리디렉션하려고 합니다. 이 스크립트를 사용한 첫 번째 시도 -

echo "Type the ACL name"
read acl
echo "Type the DATACENTER name"
read dc
echo "ACL is $acl, DC is $dc"
mkdir ~/$acl
device=($(grep -iEr $acl ~/sync-configs/$dc/configs/* | awk -F ':' {'print $1'} | awk -F '/' {'print $NF'} | sort | uniq))

스크립트는 ~/acl 디렉토리를 생성하지만 grep이 작동하지 않습니다. 그런 다음 조사한 후 grep을 조정하여 변수를 다음과 같이 큰따옴표로 묶었습니다.

echo "Type the ACL name"
read acl
echo "Type the DATACENTER name"
read dc
echo "ACL is $acl, DC is $dc"
mkdir ~/$acl
device=($(grep -iEr "$acl" ~/sync-configs/"$dc"/configs/* | awk -F ':' {'print $1'} | awk -F '/' {'print $NF'} | sort | uniq))

이것은 제대로 작동하는 것 같으며 장치 배열의 요소를 볼 수 있습니다.

내 질문은 배열에 $acl 및 $dc를 제공할 때 따옴표를 추가해야 하는데 명령에는 mkdir ~/$acl따옴표가 필요하지 않은 이유는 무엇입니까? 누군가 이것을 명확히 할 수 있습니까?

답변1

일반적으로 따옴표는 값의 문자 그대로의 의미를 보존하고 특수 문자의 해석기 변환과 매개변수 확장 및 토큰화와 같은 기타 작업을 방지하는 데 사용됩니다. 인용된 단어를
사용하는 경우 "변수는 계속 확장되지만 단어 분할은 수행되지 않습니다.
단어 분할은 쉘이 문자열을 가져와 개념적으로 이를 다른 단어나 토큰으로 나누는 프로세스입니다.
따라서 프롬프트를 읽는 동안 이것을 입력하면

bangalore data center

명령은 다음과 같이 확장됩니다.
따옴표 포함

grep -iEr "$acl" ~/sync-configs/"$dc"/configs/*

~이 되다

grep -iEr bangalore data center ~/sync-configs/"$dc"/configs/*
          ^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            pattern argument      File/s argument to grep
            to grep

인용없이

grep -iEr $acl ~/sync-configs/"$dc"/configs/*

~이 되다

grep -iEr bangalore data center ~/sync-configs/"$dc"/configs/*
          ^^^^^^^^^ |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            pattern |    File/s argument to grep

참고: 위의 내용 $dc도 확장됩니다.

관련 정보