While loop - Linux Shell Scripting Tutorial - A Beginner's handbook
bash read コマンドを利用する場合には、基本的に -r オプションを使うべき。 - Qiita
readするときはIFS=を付けておくとstrictな感じで気持ちが良い - Qiita
これらのページがとても参考になりました。
readコマンドで1行ずつ読み込む
exam.shというファイルにこれを保存しました。ヒアドキュメントでソースとなるテキストを渡しています。
1行ずつ出力されています。
\をそのまま文字として出力するにはrオプションをつける
rオプションをつけないと\が無視されてnだけ出力されます。
こんな出力のされ方は困りますね。
readにrオプションをつけると\nのまま出力してくれます。
\nは出力されますが改行としては機能していません。
行をつなげる\はrオプションをつけてもつけなくても機能する
この\はrオプションをつけてもつけてなくても同じように1行で出力されます。
ということでreadではrオプションをつけることにします。
IFS(Internal Fieled Separator)の変更
IFSはフィールド内の区切りで、デフォルトではスペース、タブ、改行がIFSになっているので、helloとworldがそれぞれXとYに代入されます。
IFSを消去する
IFS=でIFSに何も代入せずにIFSを消去します。区切り文字がないので、すべてがXに代入されています。
1行を分割して空白以外で区切られたテキストを複数の変数で受け取りたいときはIFSの変更が必要になりますね。
連続する半角スペースをそのまま表示する方法
これはechoの仕様も絡んできます。helloとworldの前に2つの半角スペースが入っていますが出力では1つの半角スペースにされています。
連続する半角スペースをそのまま出力するにはダブルクォーテーションで囲みます。
この方法では行頭のスペースはまだ1つにされてしまいます。
IFSを消去すると行頭のスペースも1つにされません。
これで入力したとおりに出力できました。
while..do..doneにデータを渡す方法
入力と出力 | UNIX & Linux コマンド・シェルスクリプト リファレンス
この入力と出力の解説を参考にします。
ファイルパスを渡す
<でファイルディスクリプタ 0番(標準入力)へのリダイレクションでファイルの内容を渡します。
コマンドの出力結果を渡す
<(コマンド)でコマンドの出力結果をファイルとして扱えます。
この機能をプロセス置換(コマンド置換)といいます。
スペースを1つにされると列がずれてしまうので出力でダブルクォーテーションを使っています。
ヒアドキュメントで複数行の文字列を渡す
<< EOS 複数行テキスト EOSで文字列を渡します。
ヒアドキュメントについてはbashのヒアドキュメントを活用する - Qiitaを参考にして先頭行と最終行の文字はEOSとしています。
ヒアストリングで文字列を渡す
<<<で文字列を渡します。
複数行の文字列は渡せませんが、$(コマンド)でコマンドが渡せます。
これで< <(ps au)と同じ結果が得られます。
<<< $(ps au)のようにダブルクォーテーションを付けないと1行にして渡されてしまいます。
0 件のコメント:
コメントを投稿