스크립트를 통해 패키지 설치

스크립트를 통해 패키지 설치

다음 스크립트가 패키지를 설치한다는 것은 이해하지만 어떤 패키지인지는 모르겠습니다.

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로 확장됩니다.

(가독성을 위해 줄바꿈을 추가하고 강조를 위해 굵은 글씨체를 추가했습니다)

관련 정보