フィールド分割にはいつ一時的な IFS を使用できますか?

フィールド分割にはいつ一時的な IFS を使用できますか?

Bashでは、以下があると仮定しますvar=a.b.c.

$ IFS=. printf "%s\n" $var
a.b.c

ただし、これらの使用法はIFS配列を作成するときに適用されます。

$ IFS=. arr=($var)
$ printf "%s\n" "${arr[@]}"
a
b
c

もちろんとても便利ですが、これはどこに記録されるのでしょうか?次の章をすばやく読んでください。ソートまたは噴射Bash ドキュメントには指示はありません。IFS貫通して見てシングルページ文書この効果のヒントも提供されません。

これはいつ安定して実行できるのかわかりません。

IFS=x do something

そして、これはIFSフィールド分割に影響を与えると予想されます。

ベストアンサー1

基本的なアイデアは、外部コマンドが実行されたときに実行されるようにVAR=VALUE some-command設定することであり、それよりもクールではありません。これらの直観をシェルの仕組みに関する知識と組み合わせることで、ほとんどの場合正しい答えを得ることができます。 POSIX 参照は次のとおりです。VARVALUEsome-commandsome-command「シェルコマンド言語」の章の「簡単なコマンド」

もしsome-commandあれば外部コマンドVAR=VALUE some-commandと同じですenv VAR=VALUE some-commandVARは環境にエクスポートされ、some-commandシェルの値(または値不足)は変更されません。

もしsome-commandあれば機能、それとVAR=VALUE some-command同じですVAR=VALUE; some-command。つまり、クォータがまだ存在する関数が返された後、変数は環境にエクスポートされません。その理由は、Bourneシェルの設計(およびそれ以降の下位互換性)に関連しています。関数の実行中に変数の値を保存および復元する機能はありません。関数はシェル自体で実行されるため、変数をエクスポートしないことをお勧めします。ただし、ksh(ATT ksh93およびpdksh / mkshを含む)、bash、およびzshは、VAR関数の実行中にのみ設定されるより便利な動作を実装します(エクスポートもあります)。存在するケシfunction NAME …、標準構文を使用して定義された関数ではなく、ksh構文を使用して関数が定義されている場合は、これを行いますNAME ()。存在する強く打つこれは、POSIXモード(ランタイム使用時)ではなくbashモードでのみ行われますPOSIXLY_CORRECT=1。存在する扱いにくいposix_builtins、このオプションが設定されていない場合、このオプションはデフォルトでは設定されていませんが、またはemulate shで設定できますemulate ksh

組み込み関数の場合、some-command動作は組み込み関数のタイプによって異なります。特殊組み込み機能関数のように動作します。特別な組み込み機能は、シェルの状態に影響を与えるため(たとえば、break制御フローに影響、cd現在のディレクトリに影響、set位置パラメータ、およびオプションに影響を与えるため)、シェル内で実装する必要があります。その他の内蔵機能組み込み機能はパフォーマンスと利便性のためのものであり(ほとんど - たとえば、bash機能は組み込みprintf -v機能としてのみ実装できます)、外部コマンドのように機能します。

エイリアス拡張後に割り当てが発生するため、ifsome-commandは次のようになります。ニックネーム、最初に展開して何が起こるかを確認してください。

すべての場合において、割り当てはコマンドライン自体の変数置換を含むコマンドラインを解析した後に行われます。そのため、課題の前に評価が行われるのでvar=a; var=b echo $var印刷されます。したがって、以前の値を使用して分割します。a$varIFS=. printf "%s\n" $varIFS$var

すべてのタイプのコマンドに対処しましたが、状況がもう1つあります。実行するコマンドがありません。つまり、コマンドに割り当て(およびリダイレクトも可能)のみが含まれている場合です。この場合、クォータがまだ存在するVAR=VALUE OTHERVAR=OTHERVALUEと同じですVAR=VALUE; OTHERVAR=OTHERVALUE。したがって、その後もIFS=. arr=($var)まだにIFS設定されています.$IFS課題では〜を使用でき、arrその課題にはすでに新しい値があると予想できるため、拡張にIFS新しい値を使用することは合理的です$var

簡単に言えば、IFS使えます一時的なフィールド分割のみ:

  • 新しいシェルまたはサブシェルを起動します(たとえば、値に2文字未満の文字が含まれている場合は動作が異なることを除いて、これはthird=$(IFS=.; set -f; set -- $var; echo "$3")複雑なアプローチです)。third=${var#*.*.}var.
  • kshでは、withはksh構文を使用して定義されIFS=. some-functionます。some-functionfunction some-function …
  • IFS=. some-functionBashとzshでは、互換モードではなくデフォルトモードで実行されている限り。

おすすめ記事