- ベストアンサー
bashシェルスクリプトで空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?
bashのシェルスクリプトで #!/bin/bash -x CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart $CMD としたのですが2行目で既にコマンドが実行されてしまいます。 空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart" eval $CMD で実行できます。 文字列をコマンドとして認識させればいいのです。
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10358)
「空白があるときどうするか」というのが疑問のようなので、#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 が必要です。空白のためで無くセミコロンのためです。
お礼
遅くなりまして申し訳有りません。 > 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)
よく見たら、脊椎反射で回答してました。すみません。 コマンド動かすなら、シェル内にコマンド記述して引数に変数使うのが普通です。 #!/bin/bash -x PRA1=restart /bin/service portmap $PRA1 /bin/service nfslock $PRA1 /bin/service nfs $PRA1 とかなら上手く行くと思うのですが・・・
補足
ご回答有難うございます。 これなら上手くいきますが、 コマンドに空白が入る場合の変数代入はどうするのか疑問に思ったのでした。 これができれば、オプション付きコマンドとかも変数に代入出来、卯クリプトファイル管理が凄くし易くなると思ったのです。
- t_nojiri
- ベストアンサー率28% (595/2071)
何で書かないと判らんのだろう? 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" したら駄目?
補足
はい、ダメでした。 CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart" としたら既述のエラーが出たのです。
- t_nojiri
- ベストアンサー率28% (595/2071)
ダブルクォートとかで囲んだら如何でしょうか?
補足
有難うございます。 : + 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} となってしまいます。
お礼
遅くなりまして申し訳有りません。 > 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 が必要です。空白のためで無くセミコロンのためです。 有難うございます。 参考になります。