質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

1回答

2667閲覧

IFS変数(区切り文字)の変更を行ったが、for文内において$IFSで改行されない

mozukku

総合スコア10

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2018/08/31 01:35

編集2018/08/31 03:00

こんにちは。
シェルスクリプト(bash)の勉強中、IFS変数を変更した際のfor文の挙動について
分からない点が発生しましたため、質問いたします。

bashバージョン

GNU bash, バージョン 4.4.19(3)-release (i686-pc-msys)
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)

実行したこと

(1)まず、$IFSがデフォルト(空白、改行、水平タブ)の状態で以下のシェルを実行しました。

for i in abc def do echo string=$i done

実行結果

string=abc string=def

(2)次に、$IFSを"/"に変更し、同様のシェルを実行しました。

IFS=/ for i in abc//def do echo string=$i done

実行結果

string=abc def

質問事項

  1. (2)の実行結果についてですが、(1)の結果のように区切り文字で改行されて出力される想定でした。

しかし、実際は改行されて出力されず、しかも$iには入力値がそのまま(abc def)入っているように見えています。これはなぜでしょうか?
0. (2)についても(1)の実行結果のように区切り文字で改行させるにはどうしたら良いでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

man bashを見ると、文章の解釈が難しいですが、(一度空白文字で区切られた)単語の区切り直しが行われるのは、ブレース展開、チルダ展開、パラメータと変数の展開、コマンド置換、算術式展開が行われたあとだけのようです。
が、しかし、実際には、ブレース展開やチルダ展開の結果には単語の区切り直しは行われず、パラメータと変数の展開、コマンド置換、算術式展開の結果にだけIFSでの区切り直しが起こるようです。アンドキュメンテッドですね。

IFSを区切りにしたいのなら、一旦変数に置くなどが必要です。

Bash

1IFS=/ 2FOO=abc//def 3for i in $FOO 4do 5 echo string=$i 6done

投稿2018/08/31 04:39

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mozukku

2018/08/31 10:58

回答ありがとうございます。 man bashの「単語の分割」項目について確認しました。 確かにパラメータ展開、コマンド置換、算術式展開についてはシェルが展開の結果に対して単語分割を行うとありますが、 その他の展開については記載がありませんでした。 裏を返せば上記以外の展開については単語分割はされないとも読み取れますね。(明示的な記載はありませんが) また、対処方法についてもご教示ありがとうございました。 文字列が無事"/"で区切られていることが確認できました。 対象文字列を変数に格納するか、コマンド展開でも区切りが行われるとのことなので、 以下のように一旦echoコマンドで出力してあげてもIFSで区切られますね。 for i in `echo abc///def` 色々検索しても分からなかったので大変助かりました。ありがとうございました。 また、これを機にman bashについてもしっかり熟読したいと思います。
otn

2018/08/31 17:30

ああ、見落としてました。「単語の分割」の節にIFSで分割を行う3つのケースが明示されていましたね。 私が見てたのは、環境変数IFSの説明(「展開を行った後」としか書いてない)と、「展開」節の冒頭です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問