• ベストアンサー

bashシェルスクリプトで空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

bashのシェルスクリプトで #!/bin/bash -x CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart $CMD としたのですが2行目で既にコマンドが実行されてしまいます。 空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • alicia-y
  • ベストアンサー率40% (85/208)
回答No.4

CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart" eval $CMD で実行できます。 文字列をコマンドとして認識させればいいのです。

KaoriM
質問者

お礼

遅くなりまして申し訳有りません。 > CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service > nfs restart" > eval $CMD > で実行できます。 > 文字列をコマンドとして認識させればいいのです。 有難うございます。 これで出来ました。 > 空白があるだけなら#1,#2さんのかかれた通り " " で囲むだけでOKです。または ' ' > でもいいです。 > CMD1="/bin/service portmap restart" > CMD2="/bin/service nfslock restart" > CMD3='/bin/service nfs restart' > $CMD1;$CMD2;$CMD3 > > セミコロンでマルチステートメントにするところまで1変数に入れるなら、#4さんの > お書きのように、eval が必要です。空白のためで無くセミコロンのためです。 有難うございます。 参考になります。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

「空白があるときどうするか」というのが疑問のようなので、#4さんの回答の補足です。 空白があるだけなら#1,#2さんのかかれた通り " " で囲むだけでOKです。または ' ' でもいいです。 CMD1="/bin/service portmap restart" CMD2="/bin/service nfslock restart" CMD3='/bin/service nfs restart' $CMD1;$CMD2;$CMD3 セミコロンでマルチステートメントにするところまで1変数に入れるなら、#4さんのお書きのように、eval が必要です。空白のためで無くセミコロンのためです。

KaoriM
質問者

お礼

遅くなりまして申し訳有りません。 > CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service > nfs restart" > eval $CMD > で実行できます。 > 文字列をコマンドとして認識させればいいのです。 有難うございます。 これで出来ました。 > 空白があるだけなら#1,#2さんのかかれた通り " " で囲むだけでOKです。または ' ' > でもいいです。 > CMD1="/bin/service portmap restart" > CMD2="/bin/service nfslock restart" > CMD3='/bin/service nfs restart' > $CMD1;$CMD2;$CMD3 > > セミコロンでマルチステートメントにするところまで1変数に入れるなら、#4さんの > お書きのように、eval が必要です。空白のためで無くセミコロンのためです。 有難うございます。 参考になります。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.3

よく見たら、脊椎反射で回答してました。すみません。 コマンド動かすなら、シェル内にコマンド記述して引数に変数使うのが普通です。 #!/bin/bash -x PRA1=restart /bin/service portmap $PRA1 /bin/service nfslock $PRA1 /bin/service nfs $PRA1 とかなら上手く行くと思うのですが・・・

KaoriM
質問者

補足

ご回答有難うございます。 これなら上手くいきますが、 コマンドに空白が入る場合の変数代入はどうするのか疑問に思ったのでした。 これができれば、オプション付きコマンドとかも変数に代入出来、卯クリプトファイル管理が凄くし易くなると思ったのです。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

何で書かないと判らんのだろう? CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart を CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart" したら駄目?

KaoriM
質問者

補足

はい、ダメでした。 CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart" としたら既述のエラーが出たのです。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

ダブルクォートとかで囲んだら如何でしょうか?

参考URL:
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/118setenv.html
KaoriM
質問者

補足

有難うございます。 : + CMD=/sbin/service portmap restart;/sbin/service nfslock restart;/sbin/service nfs restart + /sbin/service portmap 'restart;/sbin/service' nfslock 'restart;/sbin/service' nfs restart 使い方: /etc/init.d/portmap {start|stop|status|restart|reload|condrestart} となってしまいます。

関連するQ&A