저는 Dash가 rPi에서 실행되기 때문에 Dash를 사용하고 있습니다. 배쉬는 선택 사항이 아닙니다.
Dash와 함께 작동하도록 Bash 스크립트를 다시 작성 중입니다. 가능한 POSIX 규격(휴대용)으로 만들고 싶습니다. 문제는 Bash와 관련되지 않은 여러 줄 문자열을 반복하는 방법에 대한 도움말을 찾기가 어렵다는 것입니다.
내 스크립트는 100~1000개의 장치 목록을 반복해야 할 때까지 작동하며 각 장치는 텍스트 파일의 한 줄에 표시됩니다. 예를 들어 파일은 다음과 같습니다.
foo
bar
device
blah
cat
간단한 명령을 사용하여 단어를 가져옵니다 LIST="$(cat $2)"
. 여기에서 다음의 각 단어를 반복해야 합니다 $LIST
.
for ARRAY in ${LIST}
do
printf "Getting VLANS for: $ARRAY"
VLANS=$(snmpbulkwalk -v 2c -t 2 -r 3 -c "$COMMUNITY" "$ARRAY.dcs.byu.edu" XIRRUS-MIB::vlanName -Oqv)
printf "$ARRAY,$VLANS" >> "$REPORT"
done
루프가 시작되면 $ARRAY
거의 모든 것이 인쇄되므로 $LIST
사실상 무의미해집니다. 한 번에 하나의 장치만 처리할 수 있으므로 하나의 $ARRAY
단어 만 저장하는 것이 중요합니다 . snmpbulkwalk
모든 데이터를 여러 줄 문자열로 반환하지만 sed
각 개행 문자를 쉼표로 바꾸면 쉽게 처리할 수 있습니다.
그래서,문자열의 각 단어를 반복하는 정확하고 효율적인 방법은 무엇입니까?내가 이해한 바로는 Dash에는 배열이 거의 존재하지 않기 때문에 돌연변이가 훨씬 더 어려워집니다. 나는 사용해 보았습니다.우분투 가이드그리고매우 유용한 참고자료입니다. 이 글을 쓰면서 grep
한 줄씩 읽고 또 다른 for 루프를 중첩해야 할 수도 있다는 생각이 들기 시작했지만 더 쉽고 "깨끗한" 방법이 있는지는 잘 모르겠습니다.
당신들은 멋진데! 몇 가지 예를 통해 빠르고 깨끗한 응답을 제공합니다.
그래서 저는 두 가지 다른 버전의 스크립트를 만들었고 둘 다 완벽하게 작동했습니다. 첫 번째 작업은 roaima가 설명하고 Steeldriver가 제안한 대로 수행되었습니다. 루프를 while
파일을 한 줄씩 읽는 루프로 대체했습니다 . 감사합니다. 이는 작업을 단순화하는 데 큰 도움이 되며 제 경우에는 배열이 필요하지 않음을 보여줍니다.
내 두 번째 버전은 방금 교체되었으며 printf "Getting VLANS for: $ARRAY"
결국 echo "Getting VLANS for: $ARRAY"
어떤 일이 발생하는지 확인하기 위해 제거했습니다. 어쨌든 이것이 모든 차이를 만듭니다. 즉, 나머지 코드가 제대로 작동하도록 하는 모든 것을 ARRAY
포함하지 않는 것입니다 . LIST
이것이 어떻게 작동하는지에 대해 더 자세한 설명을 원하는 사람이 있으면 댓글을 통해 알려주세요.
다시 한번 감사드립니다! Bash에서는 이전보다 훨씬 빠르게 실행됩니다. snmp
이제 남은 것은 데이터를 구문 분석하기 위해 몇 가지 조정을 하는 것입니다!
답변1
이것이 파일에서 한 번에 한 줄씩 읽는 방법입니다.
while IFS= read -r DEVICE
do
....
done < your_file