특정 명령을 실행한 후 생성된 배열을 반복하려고 합니다. 사용된 코드는 다음과 같습니다:
#!/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
|
while
msg
cut
명령에서 직접 cut
데이터를 가져오므 grep
로 중간 파일이나 변수에 데이터를 저장할 필요가 없습니다.
echo $msg|mailx;
이 명령은 나에게 별로 의미가 없기 때문에 제거했습니다 ( mailx
유틸리티에는 데이터를 보낼 주소가 필요함).
+는 단일 호출로 대체될 수도 있습니다. 여기서 grep
두 도구 모두 작업을 수행하고 정규 표현식이 일치할 때 공백으로 구분된 두 번째 열을 출력합니다.cut
awk
awk
#!/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};
. 이제 작동합니다. 나머지 코드는 내 질문과 동일합니다.