2

xシェルのメタ文字を含む文字列を含むシェル変数 ( と呼びます) があります。たとえば、私は持っているかもしれません

abc  "def's"  ghi

によって設定されたとおり

x='abc  "def'\''s"  ghi'

その文字列からシェルコマンドを作成したい(実行ではなくファイルに保存する)。私のオプションは何ですか?

echo "prog $x"     >>file     # Doesn't work
echo "prog '$x'"   >>file     # Doesn't work
echo "prog \"$x\"" >>file     # Doesn't work

現在のソリューションはsed

y=`echo "$x" | sed 's/\([^a-zA-Z0-9._\-\/]\)/\\\\\1/g'`
echo "prog $y" >>file

出力は次のとおりです (ただし、同等の出力も許容されます)。

prog abc\ \ \"def\'s\"\ \ ghi

問題は、これを行う必要がある場所の数が増えていることです。誰かがより良い解決策を持っていますか?

ノート:

  • sh( とは対照的にbash) で動作する必要があり、 (エミュレーション モードなどで)sh合理的にエイリアス化される可能性があります。bashsh
  • 可能な限りポータブルである必要があります (Windows を除く)。
  • の使用は認められませんが、どこperlにでもある他の UNIX ツールの使用は認められる可能性があります。
4

2 に答える 2

5

sh機能があります。

# to_shell_lit() - Creates a shell literal
# Usage:  printf '%s\n' "...$( quote "..." )..."
to_shell_lit() {
    printf \'
    printf %s "$1" | sed "s/'/'\\\\''/g"
    printf \'
}

テスト:

$ x='abc  "def'\''s"  ghi'

$ printf '%s\n' "$x"
abc  "def's"  ghi

$ printf '%s\n' "prog `to_shell_lit "$x"`"
prog 'abc  "def'\''s"  ghi'

$ printf '%s\n' "prog $( to_shell_lit "`pwd`" )"
prog '/home/ikegami/foo bar'
$ printf '%s\n' "$( to_shell_lit "a'b" )"
'a'\''b'

$ printf '%s\n' "$( to_shell_lit '-n' )"
'-n'

$ printf '%s\n' "$( to_shell_lit '\\' )"
'\\'

$ printf '%s\n' "$( to_shell_lit 'foo
bar' )"
'foo
bar'

複数の引数を取るバージョン:

# to_shell_lit() - Creates a shell literal
# Usage:  printf '%s\n' "$( to_shell_lit "..." "..." "..." )"
to_shell_lit() {
    local prefix=''
    local p
    for p in "$@" ; do
        printf "$prefix"\'
        printf %s "$p" | sed "s/'/'\\\\''/g"
        printf \'
        prefix=' '
    done
}
于 2012-11-13T01:35:33.650 に答える