4

私はアララに電話したいdialog

dialog --menu Choose: 0 40 10 A '' B '' C ''

を除いてABおよびCは動的クエリの結果です。この質問のために、後者は{ echo A; echo B; echo C; }です。

次の方法で、目的のコマンドラインを取得できます。

{ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;"

しかし:

echo $({ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;")

およびその出力:

A '' B '' C ''

コマンド置換の結果が単語分割のみであるが''、空の引数として解釈されず、冗長に渡されることを示しますecho(したがって、dialogメニュー項目の説明は表示されず、文字通り''s になります)。

配列を使用して bash でこれを回避できますが、欠けている簡単な解決策はありますか?

与えられた

$ e() { printf "tag: [$1] item: [$2]"; }
$ e $(echo "A ''")
$ tag: [A] item: ['']

$(...)アイテムが[]の代わりになるように、パーツを変更するにはどうすればよいですか['']

4

3 に答える 3

2

良い質問です。

これが「よりシンプル」であるかどうかはわかりませんが、一定の優雅さがあります。

with-tags() {
  local line
  if read -r line; then with-tags "$@" "$line" ""; else "$@"; fi
}

{ echo A; echo B; echo C; } |
with-tags dialog --menu Choose: 0 40 10

次の形式の入力行を処理するように簡単に拡張できますTAG <optional description>

with-tag-lines() {
  local tag desc
  if read -r tag desc; then with-tag-lines "$@" "$tag" "$desc"; else "$@"; fi
}

{ echo A with optional description; echo B; echo C; } |
with-tag-lines dialog --menu Choose: 0 40 10
于 2013-08-04T21:44:45.450 に答える
1

IFS(内部フィールドセパレーター)を変更できます

$ IFS=, e $(echo "a,,")
tag: [a] item: []

うまくいくようです。それはいいですか?わかりませんが、配列マジックを試してみます。ちなみに、${parameter/pattern/string}を呼び出す代わりに for を使用できることがよくありますsed。残念ながら、それは変数でのみ動作するため、使いにくくなっています。

于 2013-08-04T19:25:59.000 に答える
0

これを試すことができます:

cmd="dialog --menu Choose: 0 40 10 "
arg="`echo $({ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;")`"
eval "${cmd}${arg}"

sedしかし、ここでは必要ないと思います。シンプルに保つことができます:

cmd="dialog --menu Choose: 0 40 10 "
arg="`echo A \'\' B \'\' C \'\'`"
eval "${cmd}${arg}"
于 2013-08-04T19:10:44.927 に答える