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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

312閲覧

Linux echoと変数について

退会済みユーザー

退会済みユーザー

総合スコア0

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

1クリップ

投稿2018/12/23 06:22

以下の動作がどうしても理解できません。

STRING="abc def ghi"

echo $STRING
abc def ghi

①下記コマンドを実行するとエラーとなります。
echo "$STRING" | sed -e "s/ghi/xyz/g"
-bash: abc: コマンドが見つかりません

②STRING=と変数に代入する形で実行すると成功します。
STRING=echo "$STRING" | sed -e "s/ghi/xyz/"
echo $STRING
abc def xyz

なぜ①は失敗してしまうのでしょう?

DrqYuto👍を押しています

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

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

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

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

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

KojiDoi

2018/12/23 06:30

> ①下記コマンドを実行するとエラーとなります。 bashでも再現しません。
退会済みユーザー

退会済みユーザー

2018/12/23 06:34

もう一度、上記作業を実行してみましたが、私の環境では、 echo "$STRING" | sed -e "s/ghi/xyz/g" -bash: abc: コマンドが見つかりません となります。
退会済みユーザー

退会済みユーザー

2018/12/23 06:44

以下のようにecho "$STRING"をecho $STRINGにしたた実行できました。 echo $STRING | sed -e "s/ghi/xyz/g" abc def xyz <-実行結果 この場合、STRINGという変数を""でくくっても、くくらなくても同じ様な気がしますが・・・謎です。
shozi3

2018/12/23 07:16

実行環境の情報を追記したほうがよろしいかと。 bash --version cat /etc/redhat-release uname -a あと、これを実行するとどうなりますか? bash -xvc "echo $STRING | sed -e s/ghi/xyz/g"
退会済みユーザー

退会済みユーザー

2018/12/23 07:25

実行してみました bash --version GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu) cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) uname -a Linux test.local.co.jp 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux bash -xvc "echo $STRING | sed -e s/ghi/xyz/g" echo abc def xyz | sed -e s/ghi/xyz/g + echo abc def xyz + sed -e s/ghi/xyz/g abc def xyz
shozi3

2018/12/23 07:47

エラー出ていませんよね ログインシェルで実行するとエラーになる?
guest

回答3

0

ベストアンサー

Bash

1echo "$STRING" | `sed -e "s/ghi/xyz/g"`

ですが、バッククォートは、中のコマンドを実行してその出力文字列と置き換わります。つまり、

Bash

1echo "$STRING" | abc def xyz

と書いたのとおおむね同じですので、-bash: abc: コマンドが見つかりませんになります。

Bash

1STRING=`echo "$STRING" | sed -e "s/ghi/xyz/"`

は、同じく、

Bash

1STRING="abc def xyz"

と書いたのと同じです。

投稿2018/12/23 09:32

otn

総合スコア84505

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

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

otn

2018/12/23 09:32

最初の例では、なぜバッククォートを書いたのか、意図は何だったんでしょうか?
shozi3

2018/12/23 09:42

なるほど。そういうオチでしたか。
guest

0

答えになってないが、tcshではエラーにならないみたいだから、bash特有かな?

text

1usr ~ % set STRING="abc def ghi" 2usr ~ % echo $STRING 3abc def ghi 4usr ~ % echo "$STRING" | sed -e "s/ghi/xyz/g" 5abc def xyz 6usr ~ % echo $STRING | sed -e "s/ghi/xyz/g" 7abc def xyz 8usr ~ %

投稿2018/12/23 06:29

編集2018/12/23 06:32
cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2018/12/23 06:32

はい。bashです。
cateye

2018/12/23 06:35

bashは使ったことがないので^^; ダブルクオート(")の解釈の仕方が違うんだと思います。
cateye

2018/12/23 06:44

echo "$STRING"をecho '$STRING'としたらどうなりますか?
退会済みユーザー

退会済みユーザー

2018/12/23 06:45

以下のようにecho "$STRING"をecho $STRINGにしたた実行できました。 echo $STRING | sed -e "s/ghi/xyz/g" abc def xyz <-実行結果 この場合、STRINGという変数を""でくくっても、くくらなくても同じ様な気がしますが・・・謎です。
退会済みユーザー

退会済みユーザー

2018/12/23 06:48

>echo "$STRING"をecho '$STRING'としたらどうなりますか? $STRINGをシングルクォートで括ったら、$はエスケープされてしまうので、$STRINGと表示されて終了します。 echo '$STRING' | sed -e "s/ghi/xyz/g" $STRING <-実行結果
cateye

2018/12/23 06:52

・・・よくわからないけどw 解決してよかった。bashの本でも買うかw
guest

0

誤爆したので削除します

投稿2018/12/23 07:42

編集2018/12/23 07:46
shozi3

総合スコア691

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問