*、一重引用符、および$文字を使用して文字列を定義します。

*、一重引用符、および$文字を使用して文字列を定義します。

メインスクリプトに必要な変数を設定するために、別の「メイン」スクリプトからbashスクリプトを作成しました。これらの変数には、以下を含めることができなければなりません。どの文字を使用し、シェルが文字を解釈することを許可しません。たとえば、

  • アポストロフィ:
  • ドル記号: $
  • スター:*
  • ハッシュ記号:#など

だから私の考えは一重引用符を使用し、囲む一重引用符と#文字をエスケープすることです。ただし、unexpected EOF while looking for matching以下の2つのファイルにエラーが発生します。

質問:

  1. 最小限の調整ですべての文字セットを含めることができる文字列を定義する最良の方法は何ですか?

    これらのファイルは何千ものあり、foo.sh他のソースから文字列を抽出するときにエスケープする必要がある特殊文字の数を最小限に抑えたいと思います。

  2. 脱出すべき他のキャラクターは何ですか?

次のスクリプトで必要な出力は次のとおりです。

\MyMacro{*,Baker's Dozen,$x^$,#}

プラットフォーム:

  • アップルシステム 10.9.5

サブシェル: foo.sh

set -f
string_list='*,Baker\'s Dozen,$x^$,\#'
set +f

メインシェル: main.sh

source foo.sh
printf "%s{%s}" "\MyMacro" "${string_list}"

ベストアンサー1

引用符内でエスケープする必要はなく、#一重引用符の中にリテラル一重引用符があるのは奇妙です。

string_list='*,Baker'\''s Dozen,$x^$,#'

しかし、二重引用符を使用すると簡単です。だからこんな感じ:

string_list="*,Baker's Dozen,\$x^\$,#"

動作します。

"\""一重引用符ではなく二重引用符のみが必要であり、変数の拡張を防ぐために''\'''エスケープも必要です。$

エスケープを最小限に抑えるには、'内部単一引用符を次に変更します'"'"'

string_list='*,Baker'"'"'s Dozen,$x^$,#'

おすすめ記事