第9章. ファイルとその他
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
何が古いファイルをシェルスクリプトにするのか? どうやってファイルを読み取るのか? この章では、そのすべてと、それ以上のことについて話そう。
読み取りファイル
bashスクリプトにファイルを読み込むには、主に3つの方法がある。 ファイル全体を "スルッと "メモリに読み込む方法と、1行ずつ読み込む方法だ。
読み取り
第2章でキーと値のペアを処理するためにすでにread 、「ユーザ入力の取得」でもう一度見ることになるが、それ以外の主な使い方は、ファイルを読み取り、入力を1行ずつ解析することだ:
$ grep'^nobody'/etc/passwd|read-d':'user shadow uid gid gecos home shell $echo"$user|$shadow|$uid|$gid|$gecos|$home|$shell"||||||
待って、何が起きたの? 僕のデータはどこだ? パイプ(| )で作成されたサブシェルに入ってしまって、出てこないんだ。 これはどうだ?
$ grep'^nobody'/etc/passwd|{\read-d':'user shadow uid gid gecos home shell;\echo"$user|$shadow|$uid|$gid|$gecos|$home|$shell"\}nobody||||||
少しはマシになったが、残りはどこだ? まあ、-d は行末の区切り文字であって、フィールド・セパレーター($IFS )ではない。 もう一回やってみよう:
$ grep'^nobody'/etc/passwd|{\read-d':'user shadow uid gid gecos home shell;\echo"$user|$shadow|$uid|$gid|$gecos|$home|$shell"\}nobody|x|65534|65534|nobody|/nonexistent|/usr/sbin/nologin
「楽しみと利益のために$IFSをいじってファイルを読み取る」も参照のこと。
lastpipe
bash 4+を実行している場合、shopt -s lastpipe をセットすると、パイプラインの最後のコマンドを現在のShellで実行し、スクリプトが環境を確認できるようになる。 これは、ジョブ制御が無効になっている場合にのみ機能することに注意する。 、スクリプトではデフォルトだが、対話型セッションでは無効になっていない。 set +m を使ってジョブ制御を無効にすることはできるが、CTRL-C、CTRL-Z、fg 、およびbg が無効になってしまうので、お勧めしない。
マップファイル
mapfile は とも呼ばれるが、同じコマンドである。 bash v4で追加された は、ファイルを配列(リスト)に読み取り、一度に 行だけを読み取ったり、 行をスキップしたり、進捗インジケータ( / )を表示したりするオプションがある。 これは他のメソッドよりずっと使いやすい。 readarray mapfile -n count -s count ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access