명령의 출력을 배열에 저장하고 싶습니다. 나는 여기에서 묻는 비슷한 질문에서 얻은 다음 명령을 사용해 보았습니다. 내가 사용한 쉘 명령을 아래에서 찾으십시오.
#!/bin/ksh
mailx -H >mytest.txt
#awk '/Incident/{ print NR;}' mytest.txt >lineNum.txt
msgNumbers=$(awk '/Incident/{ print NR;}' mytest.txt)
echo $msgNumbers
UNIX에서 이 명령을 직접 실행하여 원하는 결과를 얻을 수 있습니다. 그러나 쉘 스크립트에서 동일한 명령을 사용하면 오류가 발생합니다.
"syntax error at line 5: `msgNumbers=$' unexpected"
누군가 이것의 오류를 지적할 수 있습니까?
답변1
이 오류는 Solaris 10 및 이전 버전을 제외하고 오늘날 거의 사용되지 않는 1970년대의 아주 오래된 셸인 Bourne 셸을 사용하여 스크립트를 해석하는 경우 발생합니다.
따라서 내 생각에 이 스크립트는 /bin/sh
Solaris 10 이하에서 해석 되었으며 ksh
Solaris에서는 표준 sh
이 /usr/xpg4/bin/sh
.
Bourne 쉘은 $(...)
명령 대체 형식을 지원하지 않습니다. 명령 `...`
대체를 사용해야 합니다.
어쨌든 sh
Bourne 쉘이나 POSIX 사양은 배열을 지원하지 않습니다. Solaris 10 (ksh88 기반) 명령 출력 /bin/ksh
의 비어 있지 않은 줄 내용을 배열 변수에 할당 하려면 다음을 수행해야 합니다.
set -o noglob
IFS='
'
set -A array -- $(cmd)
(ksh88 배열은 4096개 이상의 요소를 가질 수 없습니다.)
그런 다음 배열의 요소를 다음과 같이 표시합니다.
((${#array[@]})) && printf '"%s"\n' "${array[@]}"
스크립트에 she-bang이 있는 경우 she -bang 대신 또는 대신에 #!/bin/ksh
호출해야 합니다 ./path/to/the/script
ksh /path/to/the/script
sh /path/to/the/script
답변2
명령 출력의 개별 단어를 배열에 할당하려면 ksh
다음을 수행하십시오.
array=( $( mycommand ) )
이것은 실행되고 mycommand
(귀하의 경우 명령) 명령의 출력은 공백(기본적으로 공백, 탭 및 줄 바꿈, 쉘 변수의 내용) awk
의 단어로 분할됩니다 . IFS
그러면 쉘은 set -f
유효하지 않은 각 단어에 대해 파일 이름 생성("globbing")도 수행합니다.
이러한 요소를 출력하려면 다음을 사용할 수 있습니다.
printf 'Element: %s\n' "${array[@]}"
또는
printf 'Elements: %s\n' "${array[*]}"
각 요소를 개별적으로 출력할지(첫 번째 옵션) 또는 각 요소를 첫 번째 문자로 구분하여 함께 출력할지 IFS
(두 번째 옵션)에 따라 다릅니다. 이렇게 하면 echo $array
배열의 첫 번째 요소만 출력됩니다(인용되지 않으므로 공백으로 분할하고 파일 이름 생성을 수행합니다).
awk
또는 출력을 어디에든 저장하지 않고 명령을 실행할 수도 있습니다 (이렇게 하면 분명히 결과도 출력됩니다). 이는 awk
명령 결과로 수행 하려는 작업에 따라 다릅니다 .