偶然に、シェルで再利用するために引用符を処理しようとしている場合は、それらを削除せずにこれを行うことができ、それも非常に簡単です:
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:]]'
あなただけ英数字持つようにしたいので、