쉘 스크립트에서 숫자 배열을 반복하는 방법은 무엇입니까?

쉘 스크립트에서 숫자 배열을 반복하는 방법은 무엇입니까?

특정 명령을 실행한 후 생성된 배열을 반복하려고 합니다. 사용된 코드는 다음과 같습니다:

#!/bin/bash
mailx -H|grep '^ [UN]'>ListOfMessages.txt
msgNumbers=`cut -c 4-5 ListOfMessages.txt`
echo $msgNumbers
for msg in "${msgNumbers[@]}";
do
echo $msg;
echo $msg|mailx;
done

ListOfMessages.txt는 다음과 같습니다.

 U  5 Sender1    Thu Aug 23 14:28  179/10454 Incident
 U  7 Sender2    Thu Aug 23 15:20  179/10456 Incident
 U  8 Sender3    Thu Aug 23 15:41  192/10801 Incident
 N  9 Sender4    Thu Aug 23 15:45  197/11011 Incident

배열은 필요에 따라 숫자 5 7 8 9로 업데이트됩니다. for 루프가 시작되는 줄에서 "잘못된 대체" 오류가 계속 발생합니다.

어떤 she-bang을 사용할지 알려주세요.

답변1

내가 아는 한, 귀하의 코드에는 배열이 없습니다. 이 변수는 msgNumbers명령의 출력을 보유하는 문자열입니다 cut.

출력을 반복하려면 cut다음을 사용하십시오.

#!/bin/bash

mailx -H | grep '^ [UN]' | cut -c 4-5 |
while read msg; do
    print 'msg = %s\s' "$msg"
done

그러면 바로 다음에 나오는 루프로 출력이 파이프()됩니다 cut. 루프는 set을 사용하여 각 출력 라인을 반복합니다.while|whilemsgcut

명령에서 직접 cut데이터를 가져오므 grep로 중간 파일이나 변수에 데이터를 저장할 필요가 없습니다.

echo $msg|mailx;이 명령은 나에게 별로 의미가 없기 때문에 제거했습니다 ( mailx유틸리티에는 데이터를 보낼 주소가 필요함).

+는 단일 호출로 대체될 수도 있습니다. 여기서 grep두 도구 모두 작업을 수행하고 정규 표현식이 일치할 때 공백으로 구분된 두 번째 열을 출력합니다.cutawkawk

#!/bin/bash

mailx -H | awk '/^ [UN]/ { print $2 }' |
while read msg; do
    print 'msg = %s\s' "$msg"
done

mailx이 유틸리티는 Unix 시스템에서 약간 다르게 구현되는 비표준 유틸리티이므로( -H예: 내 버전에는 옵션이 없음) 그 사용법에 대해서는 더 이상 설명하지 않겠습니다 .


#!-line 스크립트를 실행 bash하고 실행 파일을 해당 경로에 위치시키려는 경우에는 괜찮을 것 같습니다 bash(예: 일반적으로 Linux 시스템에 있지만 시스템에서 확인하십시오). command -v bash위에 게시한 코드는 다음과 호환 되지 /bin/sh않습니다 .bash진짜이를 실행하는 데 필요합니다( sh유사한 쉘에서 실행될 수 있음).

스크립트가 실행 가능한지 확인하고 명시적인 인터프리터를 지정하지 않고 실행하세요.

답변2

msgNumbers 참조를 큰따옴표로 묶지 마십시오. msgNumbers는 배열이 아니므로 인덱스는 의미가 없습니다.

답변3

()값을 배열로 저장 하는 데 사용됩니다 .

msgNumbers=(`cut -c 4-5 ListOfMessages.txt`)
echo "${msgNumbers[@]}"
for msg in "${msgNumbers[@]}";
do
echo $msg;
done

답변4

문제가 해결되었습니다. 문제는 msgNumbers가 인덱스 배열이 아니라는 것입니다. 그래서 for msg in "${msgNumbers[@]}";로 바꿨습니다 for msg in ${msgNumbers};. 이제 작동합니다. 나머지 코드는 내 질문과 동일합니다.

관련 정보