偶然に、シェルで再利用するために引用符を処理しようとしている場合は、それらを削除せずにこれを行うことができ、それも非常に簡単です:
aq() { sh -c 'for a do
alias "$((i=$i+1))=$a"
done; alias' -- "$@"
}
その関数シェルは、ユーザーが渡した引数配列を引用し、反復可能な引数ごとに出力をインクリメントします。
ここにいくつかの引数があります:
aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'
出力
1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'
その出力は、dash通常、単一引用符で囲まれた出力のように安全に引用されます'"'"'。bashするだろう'\''。
単一の非空白、非ヌルバイトの選択を別の単一バイトに置き換えることは、おそらくPOSIXシェルで$IFSとを使用して最も速く行うことができ$*ます。
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
出力
"some ""crazy """"""""string ""here
そこでprintf見ることができますが、もちろん、私がやった場合:
var="$*"
... printfコマンド$varの値ではなく、出力に表示されます。
私はときset -f、私はシェルに指示しませグロブするが-の場合には文字列がglobパターンとして解釈される可能性が文字が含まれています。これは、変数のフィールド分割を実行した後、シェルパーサーがglobパターンを展開するためです。グロビングはのように再度有効にできますset +f。一般的に-スクリプトで-私のように私の強打を設定すると便利です:
#!/usr/bin/sh -f
そしてすることを明示的グロブ有効でset +f、私はそれをしたいかもしれないものは何でもライン上。
フィールドの分割は、の文字に基づいて行われ$IFSます。
$IFS値には、$IFS空白と$IFS非空白の2種類があります。$IFS空白(スペース、タブ、改行)で区切られたフィールドは、単一のフィールドに順番に移動するように指定されています(他のフィールドの前にない場合はまったくありません)-so ...
IFS=\ ; var=' '; printf '<%s>' $var
<>
ただし、他のすべては、出現ごとに1つのフィールドに評価されるように指定されています-それらは切り捨てられません。
IFS=/; var='/////'; printf '<%s>' $var
<><><><><>
すべての変数展開は、デフォルトで$IFS区切りデータ配列です-それらは、に従って別々のフィールドに分割されます$IFS。あなたはときに"1を-quoteあなたはその配列プロパティをオーバーライドして、1つの文字列として、それを評価します。
だから…
IFS=\"\'\`; set -- $var
シェルの引数配列を、の展開$IFSによって生成された多くの区切りフィールドに設定しています$var。展開されると、に含まれる文字の構成値$IFSは失われます -現在はフィールドセパレーターにすぎません-です\0NUL。
"$*"-他の二重引用符で囲まれた変数展開と同様、-のフィールド分割品質もオーバーライドします$IFS。しかし、加えて、それはの最初のバイトに代入$IFS それぞれ区切られたフィールドの中を"$@"。だから、理由"だった最初の値は、$IFS 後続のすべての区切り文字になる"で"$*"。そして、あなたがそれを分割するとき"も、その必要はありません$IFS。あなたは変えることができ$IFS た後 set -- $args、完全に別の値にし、その新しい最初のバイトはその後のフィールド区切り文字用に表示されるでしょう"$*"。さらに、次のようにすべての痕跡を完全に削除できます。
set -- $var; IFS=; printf %s "$*"
出力
some crazy string here
tr。BASHのPEは優れていますが、この場合trははるかに高速です。例えばecho "$OUTPUT" | tr -dc '[[:alpha:]]'あなただけ英数字持つようにしたいので、