3

私のスクリプトでは、メニュー ダイアログに入力するために、ダイアログ プログラムの入力ソースとして使用するファイルを作成しました。

このファイルでは、すべての行に番号とメニュー タイトルが含まれています。

INPUT=""
rm result
while read LINE
do
        case $LINE in
            '/ >'*|---*|'/ > '*)
                  continue;;
            esac
#       echo "1 $LINE "
                echo -n " 1  \"$LINE\"" >>result
done < tmpfile
#printf "%s " $INPUT
DIALOG  --menu "Latest news " 20 50 30 `cat result`

DIALOG は関数であり、これがソースです。

DIALOG () {
        dialog --backtitle "$TITLE" "$@"
        return $?
}

ダイアログのすべてのメニュー項目には、識別子 (私の例では番号) とラベル (複数の単語の場合は二重引用符 " の間) が必要です。

問題は、ファイルの内容が正しい形式であっても、次のようになることです。

1 "item number 1" 2 "item number 2" ...

ダイアログ コマンドは \" をラベル区切り文字として認識しませんが、それを文字列の一部と見なすため、すべての単語にメニュー ボイスがあるメニューがめちゃくちゃになります。

しかし、同じファイルの内容を (スクリプトを使用せずに) シェル コマンドに直接コピー アンド ペーストしようとすると、メニューが正しく表示されます。

何か案が?

4

2 に答える 2

4

配列を使用して結果を保持し、適切な引用符を使用してに送信できますdialog

ar=()
while read n s ; do
    ar+=($n "$s")
done < result
dialog  --menu "Latest news " 20 50 30 "${ar[@]}"

おそらく、一時ファイルをまったく作成する必要はなく、すぐに配列を設定できます。

于 2012-05-24T22:50:34.733 に答える
2

問題はスペースです。上記のように IFS=$'\n' を設定し、結果ファイルの値を別々の行に保持します。

于 2017-04-27T12:48:28.700 に答える