ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

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と関連する良く見られている質問

Q空白を含んだシェル変数の代入

こんにちは。
空白を含んだシェル変数の代入について教えてください。

set test1="ABCD EFGHIJ"
set w1=$test1
echo "w1 = $w1"

このようなシェルスクリプトを実行させた時
w1 = ABCD
と表示されてしまいます。
解決案があれば教えてください。

よろしくお願いします。

Aベストアンサー

set w1="$test1"

ダブルクォーテーションで囲ってください。
この場合シングルはダメです(変数内容が展開されません)。

Qbashの関数の引数にスペースが入るとズレる件

bashの関数の引数にスペースが入るとズレる件

bashの関数の引数にスペースが入ると、引数が分離して、位置がズレてしまいます。
これを回避する方法はありませんか?


■aaa.sh-Top
#!/bin/bash
declare FuncPara1
declare FuncPara2

function f_echo() {
echo 'uf_echo1='$1
echo 'uf_echo2='$2
echo 'uf_echo3='$3
}

echo '---test1---'
FuncPara1='aaabbb'
FuncPara2='ccc'
f_echo ${FuncPara1} ${FuncPara2}

echo '---test2---'
FuncPara1='aaa bbb'
FuncPara2='ccc'
f_echo ${FuncPara1} ${FuncPara2}
■aaa.sh-Bottom

■aaa.shの実行
# ./aaa.sh
---test1---
uf_echo1=aaabbb
uf_echo2=ccc
uf_echo3=
---test2---
uf_echo1=aaa
uf_echo2=bbb
uf_echo3=ccc



このtest2の時に、
---test2---
uf_echo1=aaa bbb
uf_echo2=ccc
uf_echo3=
となって欲しい。
もしくは、何かしら「なったテイ」で、
引数1の値は「aaa bbb」
引数2の値は「ccc」
と関数側で判断できる方法はありませんか?

bashの関数の引数にスペースが入るとズレる件

bashの関数の引数にスペースが入ると、引数が分離して、位置がズレてしまいます。
これを回避する方法はありませんか?


■aaa.sh-Top
#!/bin/bash
declare FuncPara1
declare FuncPara2

function f_echo() {
echo 'uf_echo1='$1
echo 'uf_echo2='$2
echo 'uf_echo3='$3
}

echo '---test1---'
FuncPara1='aaabbb'
FuncPara2='ccc'
f_echo ${FuncPara1} ${FuncPara2}

echo '---test2---'
FuncPara1='aaa bbb'
FuncPara2='ccc'
f_echo ${FuncPara1} ${F...続きを読む

Aベストアンサー

ダブルクオートでくくっちゃダメ?

Qシェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか?

例えば、以下のようなtest.shというファイルを作ったとします。
---------------
#!/bin/sh

AAA="x y"

echo "" | awk '{print $AAA}'
--------------
としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。)

printの部分を

・awk '{print '$AAA'}'
・awk '{print "'$AAA'"}'

などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

Aベストアンサー

この場合、$AAAを展開するのは、awkではなく/bin/shです。

shで$AAAを展開して echo "" | awk '{print "x y"}'
の形にして実行します。
更に詳しく言えば
awkの引数が
{print "x y"}
という文字列になるようにします。
(awkにx yが一つの文字列として認識されるように""で括った状態に)
シングルクオートで括ってあるのは、sh側の都合で、awkにわシングルクオートは渡されません。

例えば
echo '' | awk "{print \"${AAA}\"}"
( "の中の"はバックスラッシュでエスケープ )

echo '' | awk '{print "'"${AAA}"`"}'
( 展開の必要の無い箇所はシングルクオートで。
展開する${AAA}の直前でシングルクオートを一旦閉じて
展開が終ったら、またシングルクオートで
)

ただ、どうしても煩雑になるので、やはり、直接awkの変数に代入するオプションを使った方がいいと思います。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Qshellスクリプトから別のshellスクリプトを呼び出す方法

今現在VineLinux4.1をサーバとして起動させております。
その関係もありまして維持としてシェルを動かす事はある意味必須の状態です。
本題はAと言うスクリプトからBと言うスクリプトを呼び出す方法がわかりません。
試してみた方法はsourceで呼び出す方法です。
A.shの中身を以下とすると

#!bin/bash
echo ="B.shを呼び出します"
source B.sh
echo ="シェルスクリプトを終了します"
exit 0

上記のようにした場合、最初のecho文は出力され、B.shの内容を一通り終えると最後のechoは出力されずA.shは完了しません。
ごくごく基本的なことかもしれませんが、うまく検索にも引っ掛けられなかったので、ご質問させていただきます。
よろしくお願い致します。

Aベストアンサー

#2です。

>cshは=の前後にスペースが入るかと思いますが、今回はbashを指定しておりますので。

cshの何のことを言ってるのかわかりませんが、例えばbashで、
echo="シェルスクリプトを終了します"
は、echoコマンドじゃなくて、echo というシェル変数に「シェルスクリプトを終了します」という文字列をセットするコマンドになります。当然何も表示されません。

>A.shとB.shは単独で正常に稼動できる状態です。

B.shが単独で正常に動いているように思えることは、B.shに問題がないことを意味しません。
例えば、B.sh をexitで終了したりするとそこでbashは終了するわけだし。

>質問の例はあくまで例ですが、

書かれているA.shに問題がなさそうなので、B.shの中に原因があると想像しました。
現象が発生する最小限の、A.sh と B.sh の内容をすべて正確に書いてください。

今気づきましたが、A.sh の最後に無意味なexit 0がありますが、もしかして、B.shの最後にもexit 0が?

source コマンドは、その場所に指定したファイルの内容を挿入するコマンドです( C の #include 相当 )。もし、新たにbashプロセスを起動して、そこでB.shを動かしたいなら、
bash B.sh
です。他には#1の方が書いた方法もあります。

#2です。

>cshは=の前後にスペースが入るかと思いますが、今回はbashを指定しておりますので。

cshの何のことを言ってるのかわかりませんが、例えばbashで、
echo="シェルスクリプトを終了します"
は、echoコマンドじゃなくて、echo というシェル変数に「シェルスクリプトを終了します」という文字列をセットするコマンドになります。当然何も表示されません。

>A.shとB.shは単独で正常に稼動できる状態です。

B.shが単独で正常に動いているように思えることは、B.shに問題がないことを意味しませ...続きを読む

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Q~以外を削除する場合(rmコマンド)

linuxのコマンドで
~以外のファイル、ディレクトリを全て削除したい時は
どのような記述をすれば良いのでしょうか?
シェルスクリプトではなくrmコマンド1つで削除したのいですが…

例: tar以外のファイル・ディレクトリを
   すべて削除したい場合など

どなたかご存知の方がいらっしゃったら
教えてください。よろしくお願い致します。

Aベストアンサー

rm コマンドのみという訳にはいきませんが基本的なコマンドを組み合わせると実現可能と思います。

「名前が tar で終わるもの以外のファイル・ディレクトリを削除する」場合だと

ls | grep -v -E 'tar$' | xargs rm -r

となります。

ファイルの一覧を取得し ( ls )
'tar'で終わるもの以外を抽出し ( grep )
その結果を rm -r の引数に指定して実行 ( xargs )

という流れです。

ファイルを削除するような操作については失敗するとダメージが大きいので、事前にテストして動作を確認すると良いとおもいます。また rm -r -i としてそれぞれのファイルについて、削除の問い合わせをするのも有効です。


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

人気Q&Aランキング