Unixシェルスクリプトでコマンドの出力を配列としてどのように保存できますか?

Unixシェルスクリプトでコマンドの出力を配列としてどのように保存できますか?

コマンドの出力を配列に保存したいと思います。私はここで尋ねる同様の質問から得て、次のコマンドを試しました。私が使用したシェルコマンドを以下で見つけます。

#!/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/shSolaris 10以下で解釈され、kshSolarisでは標準shです/usr/xpg4/bin/sh

Bourne シェルは$(...)コマンド置換形式をサポートしません。コマンド`...`置換を使用する必要があります。

とにかく、shBourneシェルや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/scriptksh /path/to/the/scriptsh /path/to/the/script

おすすめ記事