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

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

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

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

Q&A

解決済

1回答

3480閲覧

Bashシェルで$PATHを要素に分解。スクリプトではうまくいってワンライナーではうまくいかない理由

jun68ykt

総合スコア9058

bash

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

0グッド

0クリップ

投稿2016/08/19 07:29

首題の件、ご教示いただきたく投稿します。

以下は、環境変数 PATH を構成する各ディレクトリを一行ずつ表示させるシェルスクリプト、
print_path_dirs.sh
を作成して、実行したところです。


[ykt68@MacBook mywork]$ echo $PATH
/Users/ykt68/.rbenv/shims:/Users/ykt68/.pyenv/shims:/Users/ykt68/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:.
[ykt68@MacBook mywork]$ cat print_path_dirs.sh

#!/bin/bash OLD_IFS=${IFS} IFS=: for e in $PATH do echo $e done IFS=${OLD_IFS}

[ykt68@MacBook mywork]$ bash print_path_dirs.sh
/Users/ykt68/.rbenv/shims
/Users/ykt68/.pyenv/shims
/Users/ykt68/.pyenv/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Library/TeX/texbin
.
[ykt68@MacBook mywork]$


上記は正しく実行できています。

次に、このスクリプトと同じことを、シェルプロンプトへのワンライナーでやろうとしました。
まず、以下のコマンドラインではダメでした。

[ykt68@MacBook mywork]$ (IFS=':' for e in $PATH; do echo $e; done)

上記だと

-bash: syntax error near unexpected token `do'

とシンタクスエラーになってしまいます。そこで調べまして、$PATHをいったん配列変数に入れて

[ykt68@MacBook mywork]$ (IFS=':' ARRAY=($PATH); for e in ${ARRAY[@]}; do echo $e; done)

とするとこれはうまくいき、PATHの各要素が表示されました。

そこで質問なのですが、

[ykt68@MacBook mywork]$ (IFS=':' for e in $PATH; do echo $e; done)

だとシンタクスエラーになる理由が分かりません。
これだと、なぜ

-bash: syntax error near unexpected token `do'

になってしまうのかご教示いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

IFS=':'; for e in $PATH; do echo $e; done)

で syntax error が解消されます.
代入は1行で複数回できるため

(IFS=':' ARRAY=($PATH); for e in ${ARRAY[@]}; do echo $e; done)

では,IFS=':' ARRAY=($PATH); が1行と解釈されているためエラーが起きません.

後者では,IFS=':' for e in $PATH; が1行と解釈され期待しない位置で for コマンドを呼び出しているためエラーとなっております.

投稿2016/08/19 07:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jun68ykt

2016/08/19 07:40

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問