スクリプトでzenityのスペースを使用しようとしたときに発生する問題[重複]

スクリプトでzenityのスペースを使用しようとしたときに発生する問題[重複]

これは端末で直接実行されますが、うまく機能します。

zenity --info --text "pure info" --title "get info"

しかし、このスクリプトは機能しません。何が起こっているのでしょうか?

!/bin/bash
ZEN="--info --text \"pure info\" --title \"get info\""
zenity $ZEN

スクリプトは「テキストの情報とタイトルの「jeevan」を出力します。残りはスキップします。
二重引用符内のスペース(特殊文字)がその特別な意味を失うためですか?

ベストアンサー1

違いは、コマンドがzenity最初のケースでは複数の引数を見ることができますが、2番目のケースでは1つの引数(多くのスペースを含む)しか表示できないことです。

次のawkプログラムを使用すると、シェルが引数を拡張した内容をすばやく出力できます。問題が発生した場合は、zsh問題を再現できます。

% awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN                                               
ARGV[0] = awk
ARGV[1] = --info --text "pure info" --title "get info"

そしてbashそれは次のようになります(引用符付き文字列は単語に分割されています)。

$ awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN
ARGV[0] = awk
ARGV[1] = --info
ARGV[2] = --text
ARGV[3] = "pure
ARGV[4] = info"
ARGV[5] = --title
ARGV[6] = "get
ARGV[7] = info"

この動作を処理するシェルトークン化オプションが必要です。

しかしこれはうまくいきます:

set -- --info --text "pure info" --title "get info"
zenity "$@"

編集する:

シェルの単語分離機能は基本的に少し愚かです。bash上記の例の動作を参照してください。"pureinfo"2つの別々の単語。コマンドラインオプションを解析するときにこれは面倒なので、以下はマニュアルの特別なパラメータセクション"$@で引用したものです。bash

   @      Expands  to  the positional parameters, starting from one.  When
          the  expansion  occurs  within  double  quotes,  each  parameter
          expands to a separate word.  That is, "$@" is equivalent to "$1"
          "$2" ...

一般的な変数拡張を特別に処理する方法が見つかりませんでしたが、トリックがある可能性が$@あります。

このsetコマンドは位置パラメータ$1$2...を設定します。したがって、位置引数の「すべて提供」バージョン$@も使用できます。

おすすめ記事