다음 스크립트가 패키지를 설치한다는 것은 이해하지만 어떤 패키지인지는 모르겠습니다.
for package in ${d[@]};
do
rpm -ivh --quiet ${!package} >/dev/null 2>&1
무엇인가요 ${d[@]}
?
답변1
${d[@]}
array 의 모든 요소를 나타냅니다 d
.
이는 또한 스크립트를 작성한 사람이 실수로 큰따옴표를 사용하지 않았기 때문에 방어적으로 작성하지 않았다는 것을 의미합니다. for 루프는 다음과 같이 작성되어야 합니다.
for package in "${d[@]}";
이렇게 하면 의 각 요소는 d
포함된 내용에 관계없이 별도의 단어(즉, for 루프에 대한 인수)로 확장됩니다.
큰따옴표가 없으면 요소는 d
일반적인 쉘 토큰화 및 확장의 적용을 받습니다(예: 공백이 포함된 요소는 다음과 같이 처리됩니다).둘하나가 아닌 for 루프의 매개변수). 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?더 자세한 설명을 원하시면.
이는 문맥 상으로는 괜찮을 수 있지만(즉, d
공백이나 기타 쉘 메타 문자 없이 패키지 이름만 포함하는 경우) 모든 쉘 프로그래머에게는 나쁜 습관입니다.
에서 man bash
장 제목 아래 Arrays
:
참조 배열의 모든 요소를 사용할 수 있습니다
${name[subscript]}
. 경로 이름 확장과의 충돌을 방지하려면 중괄호가 필요합니다.아래 첨자가
@
또는*
이면 단어는 name의 모든 구성원으로 확장됩니다. 이러한 아래첨자는 단어가 큰따옴표 안에 나타날 때만 다릅니다.단어가 큰따옴표로 묶인 경우
${name[*]}
다음과 같이 확장됩니다.한 단어 각 배열 구성원의 값은 IFS 특수 변수의 첫 번째 문자로 구분되며${name[@]}
name의 각 요소는 다음으로 확장됩니다.별도의 단어. 배열 멤버가 없으면${name[@]}
null로 확장됩니다.
(가독성을 위해 줄바꿈을 추가하고 강조를 위해 굵은 글씨체를 추가했습니다)