- ベストアンサー
bashシェルスクリプトで空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?
bashのシェルスクリプトで #!/bin/bash -x CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart $CMD としたのですが2行目で既にコマンドが実行されてしまいます。 空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?
- KaoriM
- お礼率86% (153/177)
- その他(プログラミング・開発)
- 回答数5
- ありがとう数3
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart" eval $CMD で実行できます。 文字列をコマンドとして認識させればいいのです。
その他の回答 (4)
- notnot
- ベストアンサー率47% (4848/10262)
「空白があるときどうするか」というのが疑問のようなので、#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} となってしまいます。
関連するQ&A
- [シェルスクリプト内で bashコマンド後のコマンドが実行されない]
[シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?
- ベストアンサー
- Linux系OS
- シェル・スクリプトへの変数の定義方法を教えて下さい。
シェル・スクリプトへの変数の定義方法を教えて下さい。 下記コマンドを実行するには、変数にどの様に指定すれば良いでしょうか。 宜しくお願い致します。 手入力での正しいパラメーターの渡し方。 ./test.sh parm1 parm2 "parm3 a b [\"X\" \"Y\"];" シェル・スクリプトでのパラメーターの渡し方は? #!/bin/bash Cmd=" ????????????? どの様に指定すれば良いでしょうか? ?????????????" buf=$(Cmd)
- 締切済み
- その他(プログラミング・開発)
- bashシェルスクリプトで変数を使う
bashシェルスクリプト内で変数を使いたいです。 Linux内の設定ファイルを参考に、 ・変数名=その内容、で設定 ・${変数名} 、で呼び出す だと判断し、以下のように使っています。 #!/bin/bash WORK=/home/aaa/ cd ${WORK} その後検索したところ、 「呼び出すには、$変数名 のように記述する」との説明を見かけ、 実際$の後に変数名を付けるだけでも認識したのですが、 { }は付けても付けなくてもよいのでしょうか。 { }が必要な場合もあるのでしょうか。
- ベストアンサー
- Linux系OS
- シェルスクリプト bashのtestコマンドが動きません
こんにちは、ど素人なのにシェルスクリプト仕事で書かされ苦しんでます。 SUN-solaris8で動作したシェルをLinuxE3.0へ移動させたら testコマンドでエラーになりました。 SUN-solaris8ではbsh LinuxE3.0ではbashです。 test -s file名は両方で認識するようですが、 test -s ../directory名/file名で指定して 実行するとSUNでは動作したのですが Linuxではわけの分からないメッセージが出て終了。 Linuxで % sh と打つと/bin/bash % test と打つと /XXX/usr/binだったかな?パス忘れました。 % man bashでマニュアル見るとtestは[]で囲め? 英語だから良く分からなかった。 疲れたので今日は諦めました。 testコマンドで良い解決法ご教示願います。 情報が不足なら指摘いただいた物を追加いたします。
- ベストアンサー
- Linux系OS
- シェルスクリプト コマンドを変数にした時の呼び方
はじめまして、シェルスクリプトを勉強中の者です。 コマンドを変数にいれて、まとめました。 しかしコマンドの変数を呼びこもうとするとエラーになります。 ============================================ #!/bin/sh GREP="grep" cat "${GREP} '^[0-9]' /home/hoge/test.nicdf" ============================================ ================ シェル実行結果 ============= $ ./test.sh cat: grep '^[0-9]' /home/hoge/test.nicdf: そのようなファイルやディレクトリはありません どう書けば、エラーにならずに正常に動作するでしょうか? ご教授の程よろしくお願いします。
- ベストアンサー
- Linux系OS
- シェルスクリプトのbashとperlについて
シェルスクリプトのbashとperlについて 今さら気づいたのですが、PerlもUNIXのコマンドやシェルスクリプトとして使用できるということでしょうか。 RubyやPHPをUNIXのコマンドやシェルスクリプトとして使用することはできますでしょうか。 学ぶとしたら、bashとPerlのどちらが良いでしょうか。 また、シェルスクリプトはどんな用途や利点がありますでしょうか。 Webアプリケーションによるバックアップやログをタイマーでセットして自動的に取得したりすることは可能でしょうか。
- ベストアンサー
- Linux系OS
- bashで変数にパイプを入れ、コマンドとして使う?
パイプを含む文字列が入った変数をシェルコマンドとして実行する方法がありましたら 教えてください。 Linux環境で、bashを使って定期的にモニタリングするスクリプトを書こうとしています。 スクリプトの引数で実行するモニタリングコマンドを変えれるようにしたいのですが、 パイプが入っているとうまくいきません。 下記のようなスクリプトで、引数に "ps -ef | grep pty" と入れたら、定期的に そのようなコマンドを実行できるようにできますでしょうか? (引数指定時に、きちんとクォーテーションで全体を囲んで、パイプが評価されない ようにしてもダメでした。) 変数として入ったコマンドを実行するときに、パイプがシングルクォーテーションで 囲まれて "ps -ef '|' grep pty" のようになってしまい、パイプとして実行時に認識 されないようです。 bashシェルで設けてる制約でしょうか?回避策などありますでしょうか? <<スクリプト poll.sh>> ## # Defs export RUNCMD='finger' export INTERVAL=10 ## # Getopt while getopts "t:" OPT; do case ${OPT} in t) INTERVAL=${OPTARG};; esac done shift $((OPTIND-1)) [ ${#} -gt 0 ] && RUNCMD="${*}" ## # Main part while :; do (set -x; ${RUNCMD}; sleep ${INTERVAL}); done
- ベストアンサー
- Linux系OS
- シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。
シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。
- ベストアンサー
- Linux系OS
- 【シェルスクリプト】 ローカル変数、グローバル変数
シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。
- ベストアンサー
- その他(プログラミング・開発)
- bash:あるプロセスをkillするスクリプト
こんにちは。 RedHat9を使っています。 bashシェルで、コマンドの実行結果を変数にわたすには、どうしたらいいですか? mpg123でmp3を聞いています。 ターミナルからCtrl+Cを2回入力するのではなしに、スクリプトを走らせるだけで実行をとめたいです。 ps -A | grep 'mpg123' の実行結果を変数に入れて、killコマンドの引数にその変数をわたせばいいんじゃないかと思ったんですが。 すみません、よろしくおねがいします。
- ベストアンサー
- その他(OS)
お礼
遅くなりまして申し訳有りません。 > 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 が必要です。空白のためで無くセミコロンのためです。 有難うございます。 参考になります。