bashのシェルスクリプトで

#!/bin/bash -x
CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart
$CMD

としたのですが2行目で既にコマンドが実行されてしまいます。
空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

このQ&Aに関連する最新のQ&A

とは NFS」に関するQ&A: LinuxのNFSとは?

A 回答 (5件)

CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart"



eval $CMD

で実行できます。
文字列をコマンドとして認識させればいいのです。
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳有りません。

> 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 が必要です。空白のためで無くセミコロンのためです。
有難うございます。
参考になります。

お礼日時:2005/03/09 02:14

「空白があるときどうするか」というのが疑問のようなので、#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 が必要です。空白のためで無くセミコロンのためです。
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳有りません。

> 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 が必要です。空白のためで無くセミコロンのためです。
有難うございます。
参考になります。

お礼日時:2005/03/09 02:13

よく見たら、脊椎反射で回答してました。

すみません。
コマンド動かすなら、シェル内にコマンド記述して引数に変数使うのが普通です。

#!/bin/bash -x
PRA1=restart
/bin/service portmap $PRA1
/bin/service nfslock $PRA1
/bin/service nfs $PRA1

とかなら上手く行くと思うのですが・・・

この回答への補足

ご回答有難うございます。

これなら上手くいきますが、

コマンドに空白が入る場合の変数代入はどうするのか疑問に思ったのでした。

これができれば、オプション付きコマンドとかも変数に代入出来、卯クリプトファイル管理が凄くし易くなると思ったのです。

補足日時:2005/02/21 14:25
    • good
    • 0

何で書かないと判らんのだろう?



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"

としたら既述のエラーが出たのです。

補足日時:2005/02/21 09:44
    • good
    • 0

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



参考URL:http://www.atmarkit.co.jp/flinux/rensai/linuxtip …

この回答への補足

有難うございます。


+ 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}

となってしまいます。

補足日時:2005/02/21 00:23
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAndroid / AsyncTaskの第1引数

■コード
Hoge hoge = new Hoge();
hoge.execute();

public class Hoge extends AsyncTask<Object, 第2引数, 第3引数> {

 protected List<Piyo> doInBackground(Object... params) {


■質問1
・executeで引数を渡していないに、なぜ引数を受け取れるのでしょうか?
(doInBackgroundメソッド引数として受け取っているで合っている?)
・処理の流れ的には、executeで渡した引数がdoInBackgroundメソッド引数となり、その型をAsyncTask第1引数で指定している?
・それとも、executeで渡す引数の型をAsyncTask第1引数で指定しているから、予め指定された型のみをdoInBackgroundメソッド引数として受け取れる?


■質問2
・リンク先に、下記主旨の記述があるのですが、「自分で好きに型を選択できる」とはどういう意味なのでしょうか?
>冒頭の型変数のParamsはdoInBackgroundメソッドの引数で、自分で好きに型を選択できる
>execute()メソッドの引数に渡されたものがこのdoInBackgroundのparamsとして渡ってくる
・paramsとして渡された型を、AsyncTask第1引数で宣言することで自由に変更できる?
・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる?
http://d.hatena.ne.jp/Nagise/20120309/1331265123

■コード
Hoge hoge = new Hoge();
hoge.execute();

public class Hoge extends AsyncTask<Object, 第2引数, 第3引数> {

 protected List<Piyo> doInBackground(Object... params) {


■質問1
・executeで引数を渡していないに、なぜ引数を受け取れるのでしょうか?
(doInBackgroundメソッド引数として受け取っているで合っている?)
・処理の流れ的には、executeで渡した引数がdoInBackgroundメソッド引数となり、その型をAsyncTask第1引数で指定している?
・それとも、executeで渡す引数の型をAsyncTask第1引...続きを読む

Aベストアンサー

こんにちは
>executeで引数を渡していないに
executeの引数は可変長です。
つまり、引数なしでもいいですし、1個でも2個でも3個でもOKです。
http://developer.android.com/reference/android/os/AsyncTask.html
同様に、doInBackgroundの引数も可変長です。
つまり、executeで渡された引数と同じものが、そのままdoInBackgroundに渡される仕組みです。
ですから、
hoge.execute();
とした場合は、引数はありませんから、doInBackgroundでも何も受け取れません。

>・リンク先に、下記主旨の記述があるのですが、「自分で好きに型を選択できる」とはどういう意味なのでしょうか?
>・paramsとして渡された型を、AsyncTask第1引数で宣言することで自由に変更できる?
>・それとも、AsyncTask第1引数で指定することで、doInBackgroundのparamsとして渡されてくる型を制限(指定)できる?
どちらも違います。
「executeの引数として、好きな型を使用できる」ということですね。
もちろん、doInBackgroundで受け取れる型も同じ型になります。勝手に変更されたりはしません。
どんな型を使用するのかはクラスの定義時に指定します。質問者さんが、「AsyncTask第1引数」とおっしゃっている場所ですね。
正式には、引数ではないので、「第一引数」とは呼びません。
「ジェネリック」で調べると、いろいろ詳しいことがわかると思います。

こんにちは
>executeで引数を渡していないに
executeの引数は可変長です。
つまり、引数なしでもいいですし、1個でも2個でも3個でもOKです。
http://developer.android.com/reference/android/os/AsyncTask.html
同様に、doInBackgroundの引数も可変長です。
つまり、executeで渡された引数と同じものが、そのままdoInBackgroundに渡される仕組みです。
ですから、
hoge.execute();
とした場合は、引数はありませんから、doInBackgroundでも何も受け取れません。

>・リンク先に、下記主旨の記述があるのです...続きを読む

Q自分のPCにIISを入れたときの、配布CGIの !/usr/bin/perl って?

よく無料で配布されている、
掲示板とかの初めの行に !/usr/bin/perl 
をプロバイダにあわせて直してくださいと
記述がありますが、、

自分のPCにIISをインストールして
運用したいとき、自分のPCがプロバイダ(?)
なわけで、どのように設定すればよいのでしょうか?

Aベストアンサー

何でもいいです。
!/usr/bin/perl 
でも
!/usr/local/bin/perl 
でも。
元々これはLinuxサーバ上での法則のようで、Windows上では無視されるようですよ。

参考URL:http://www.lira.co.jp/t-room/xp_server/

Q/proc/sys/net/ipv4/route/flushは無効な引数?

/proc/sys/net/ipv4/route/flush
というファイルをcatの引数に指定すると
「無効な引数です」と言われます。
普通、読めないファイルの場合は
「許可がありません」というメッセージなのに、
このファイルだけは「無効な引数です」と言われるのです。
エラーメッセージが異なるということは別のエラーということだと思うのですが、
「無効な引数です」というメッセージはどのような場合に表示されるものなのですか。

たとえばwcの引数に指定した場合、次のようにエラーメッセージと通常の結果の両方を表示します。
$ wc /proc/sys/net/ipv4/route/flush
wc: /proc/sys/net/ipv4/route/flush: 無効な引数です
0 0 0 /proc/sys/net/ipv4/route/flush

ですのでエラーメッセージをリダイレクトしてしまえば、何の問題もないように思えるのですが・・・
これでいいのかなぁ。

Aベストアンサー

Linux で /proc 以下のファイルは特殊なファイルです。/proc以下のファイルは、カーネルとのインターフェイスになっていて、ファイルとしての実体はありません(man 5 proc 参照)。カーネルの中に、/proc 以下のこのディレクトリにアクセスがあったら、こういう値を出力する(読み込みの場合)、その値をカーネルのこの変数に代入する(書き込みの場合)というようなプログラムが書かれています。

ということで、属性が変更できないのは当然です。ちなみに CentOS 4.4 では

$ ls -l /proc/sys/net/ipv4/route/flush
--w------- 1 root root 0 Nov 21 10:39 /proc/sys/net/ipv4/route/flush

となっています。これを

$ strace wc /proc/sys/net/ipv4/route/flush

とするとどこで、どういうエラーになったか分かります。CentOSの場合、沢山の出力の後、

....
open("/proc/sys/net/ipv4/route/flush", O_RDONLY|O_LARGEFILE) = -1 EACCES (Permission denied)
write(2, "wc:
....

となります。まあ、これはrootでないので当然の結果ですが。

Linux で /proc 以下のファイルは特殊なファイルです。/proc以下のファイルは、カーネルとのインターフェイスになっていて、ファイルとしての実体はありません(man 5 proc 参照)。カーネルの中に、/proc 以下のこのディレクトリにアクセスがあったら、こういう値を出力する(読み込みの場合)、その値をカーネルのこの変数に代入する(書き込みの場合)というようなプログラムが書かれています。

ということで、属性が変更できないのは当然です。ちなみに CentOS 4.4 では

$ ls -l /proc/sys/net/ipv4/rou...続きを読む

QbashからFTPコマンドのステータスを調べる方法

bashからFTPコマンドのステータスを調べる方法

シェルでFTPによるファイル転送を行っていますが、FTPが成功したかどうかをシェル側で受け取ることはできますか?

FTP転送に失敗したら、3回やりなおして、それでダメならあきらめるというスクリプトにしたいです。


<サンプル>
/usr/bin/ftp -n -v hostname << EOF
user user1 passwd1
binary
put file1
bye
EOF

Aベストアンサー

参考URLに同じような質問がありましたので、そちらを参考にされてはいかがでしょうか?

参考URL:http://oshiete.goo.ne.jp/qa/2656080.html

QPL/pgSQL 引数の数

PL/pgSQL を使用し更新処理を行いたいのですが、
パラメータの数が多すぎるのか
以下のエラーでデータベースにファンクションを定義出来ません。
ERROR: functions cannot have more than 100 arguments
SQLステート:54023

可変長引数で作成すると、データベースに定義は出来るのですが
ファンクション実行時に同様のエラーが発生し更新処理が行えません。

PL/pgSQL の引数を100以上使用出来る様にする設定等、存在するのであれば
教えて頂きたいです。

環境は以下の内容です。
CentOS-6.2-x86_64
Apache/2.2.15
PostgreSQL 9.1.3
PHP Version 5.3.3 (PDOを使用しています)

Aベストアンサー

100 以上の引数をもった関数を定義できるようにするには、ソースコードを修正してコンパイルしなおす必要があります。

ヘッダファイル src/include/pg_config_manual.h 内の定数 FUNC_MAX_ARGS を修正してください。ソースコードのコメントには約 600 まで増やせるということです。

100 以上の引数をもつ関数を定義すること自体、設計に何らかの問題がありそうなので、そちらを見なおしたほうがよいと思います。

あるいは、引数を配列や複合型で渡すことを考えたほうがいいかもしれません。

Q#!/bin/sh

test.shを実行すると、test.shのフォルダに現在の時刻を書いたt.txtを作成するというtest.shのソースを教えてください。

Aベストアンサー

#!/bin/sh

output_file=./t.txt

# 年月日時分秒
now_dt=`date '+%Y%m%d%H%M%S'`

echo $now_dt > $output_file

こんな感じでしょうか?

QObjective-CのNSTaskの引数に全角/半角スペース及び日本

Objective-CのNSTaskの引数に全角/半角スペース及び日本語を含むパスが指定された場合に正常に処理が行えません。
どのように引数をしていすればいいのか、教えていただきたく投稿させていただきます。

実行するアプリはAutomatorで作成したアプリの為、openコマンドに引数-aを指定しています。

NSTask *tast = [[NSTask alloc]init];
NSString *Command = [NSStrign stringWithFormat:@"/usr/bin/open"];
NSArray *arguments = [NSArray arrayWithObjects:@"-a",
[NSMutableString stringWithFormat:@"%@",アプリのパス],
[NSMutableString strignWithFormat:@"%@",ファイルのパス],
nil];
[task setLaunchPath:Commadn];
[task setArguments:arguments];
[task launch];
[task waitUntilExit];
[task release];

引数配列のargumentsを途中で出力した場合にスペース部がバックスラッシュでエスケープ、日本語はエンコード?されていました。
ダブルクォーテーションで囲んでみたのですが、ダメでした。

どなたか、お分かりなられる方おられましたら、ご教授の程宜しくお願いします。

Objective-CのNSTaskの引数に全角/半角スペース及び日本語を含むパスが指定された場合に正常に処理が行えません。
どのように引数をしていすればいいのか、教えていただきたく投稿させていただきます。

実行するアプリはAutomatorで作成したアプリの為、openコマンドに引数-aを指定しています。

NSTask *tast = [[NSTask alloc]init];
NSString *Command = [NSStrign stringWithFormat:@"/usr/bin/open"];
NSArray *arguments = [NSArray arrayWithObjects:@"-a",
[NSMutableString stringWithFormat:@"%@",アプ...続きを読む

Aベストアンサー

こんちは。
NSTaskは使った事無いのですが、ファイルパス名をURLで指定してみてはいかがでしょう?

NSTaskはFoundationフレームワークのクラスなので、ファイルやディレクトリの場所は、
ファイルパス名/URLどちらでも指定できると思います。

で、URLはスペースや英数字以外の文字は使用できないので、UTF-8でテキストエンコーディングします。
NSStringクラスには、stringWithUTF8Stringみたいなエンコードメソッドが多数あるので試してみては?

Q#!/bin/gawk -f ???スクリプトの一行目

bashのスクリプトの一行目に、環境に合わせて、
#!/bin/gawk -f
とか
#!/usr/local/bin/bash -f
とか書かないとだめですよね。

環境が変わるごとに(bashのパスが変わるごとに)この部分を書き換えるのが面倒なのですが、よい方法はないものでしょうか?

Aベストアンサー

#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。

一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル以外から起動される場合はエラーになりますが。直接シェルから起動しなくても例えばC言語のsystem()関数はシェル経由でプログラムを起動するのでこういった場合もOKです。

>・env がスペース付き引数に対応する
env は元々、env VAR=value cmd arg1 arg2 のようにcmd arg1 arg2 を実行する際に環境変数VARにvalueという値を設定してから実行するというコマンドなのでこういう変更はありえないです。envの改造じゃなくてコマンドラインを解析するミニシェルを作ってそれを
#!/bin/minish awk -f のように指定すればOKです。

>・"gawk -f" に対応するコマンド gawkf (?)を用意する(gawk -f を一つの引数にするため)
そのgawkfをどこのディレクトリに置くかという問題が新たに発生します。

ちょっとトリッキーで一部制約もありますが、shはまず間違いなく/binにあるので、gawkの場合、

#!/bin/sh
ZZ==1{ exec sh -c "cat $@ | gawk -f $0" ;}
awkスクリプト
。。。

で、大抵のケースは出来ると思います。上に書いたようにシェルからしか起動しないなら1行目は不要です。

ruby言語だとこういうことを想定してあって、#! ruby という行まで読み飛ばす -x というオプションがあります。この際、rubyに乗り換えては?
#!/bin/sh
exec ruby -S -x $0 $@
#! ruby
rubyスクリプト
。。。

#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。

一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル...続きを読む

QPL/SQLのFUNCTIONにおける引数について

PL/SQLで、FUNCTIONを作成しています。
そのFUNCTIONの引数に
StringList型の配列を受け取りたいのですが、
どのように書いたらよろしいのでしょうか?

申し訳ありませんが、教えて下さい。

Aベストアンサー

こんにちは。

>>StringList型の配列を受け取りたいのですが
何から?

FUNCTIONの引数にPL/SQL表などを使用するのなら、Packageにしてヘッダー部で型を宣言しないと・・・。

Qbashにてログを書き出すコマンド

未経験で小さいシェルスクリプトを組んでいます。
バックグラウンドで動いているので、rmやmvをした時に何らかのメッセージがでてスクリプトがとまらないようにログ吐き出しをしたいのです。

それで、先人の書いたスクリプトを部分コピーしながらうまくやっていたのですが、ちゃんと意味を知らなければと思って質問しています。

たとえば
rm $ファイル 2>> $ログファイル 1>&2

という記述がありまして、
2>> というのがどういう意味を持つのかが分かりません。

1>&2はググったところ、書き出しの順番のようですが、数字と&が具体的に何を意味しているか分かりませんでした。

bashのこういったコマンド群で参考になるサイトをご存じの方は教えていただけませんでしょうか。

また、簡単に上述の意味を教えていただけるとうれしいです。
よろしくお願いします。

Aベストアンサー

> や >> などは「リダイレクト」と呼ばれます。
「bash」と「リダイレクト」で検索するとよいでしょう。

1は標準出力
2は標準エラー出力なので

2>> は標準エラー出力を $ログファイルに「追記」するです
2> にするとログファイルの過去の内容が消えてしまいます。

1>&2 は標準出力と標準エラー出力を一緒に出力したい場合に使用します。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報