반복해야 하는 여러 줄 문자열이 있지만 bash를 사용하지 않습니다. 제안?

반복해야 하는 여러 줄 문자열이 있지만 bash를 사용하지 않습니다. 제안?

저는 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

관련 정보