- PR -

こんなことをshellスクリプトで出来ますか?

1
投稿者投稿内容
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2003-06-04 21:01
 お世話になります。Redhat8.0を使用しております。普通なら

[root@ws01]#pwd
/root
[root@ws01]#echo "Hello 'test' !!" > test1.txt
[root@ws01]#cat test1.txt
Hello 'test' !!

となるのに

[root@ws01]#ssh root@ws02 'echo "Hello 'test' !!" > test2.txt'

とやると

[root@ws02]#pwd
/root
[root@ws02]#cat test2.txt
Hello test !!

となってシングルクォーテーションが入ってくれません。。
どうにかしてシングルクォーテーションもSSH経由でリダイレクトしたいのですが、どうすればよいでしょうか。。

ご教授願います。


[ メッセージ編集済み 編集者: okumura 編集日時 2003-06-04 21:02 ]
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-06-04 21:59
エスケープすればいいとは思いますが,

ssh root@ws02 'echo "Hello \\'test\\' !!" > test2.txt'

なんて単純にやってもたぶんダメでしょうね・・・。
ちょっと工夫して,

ssh root@ws02 'echo "Hello '\\'test\\'' !!" > test2.txt'

なんかでどうでしょう?
(「test\」の直後は,ダブルクォーテーションにも見えますが
シングルクォーテーション2つです。
「!!」の直後はダブルクォーテーションです。)

# いやー,この会議室でバックスラッシュとクォーテーションの
# 組み合わせ書くのって,ちょっとコツがいるんですね。
# プレビューでは期待通りの表示だったのに・・・。
# で,直しました。

[ メッセージ編集済み 編集者: raccoon 編集日時 2003-06-04 22:04 ]
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2003-06-05 08:31
 な!なんと!!成功しました!ありがとうございます。。
しかし、これはいったいどういう構造なのでしょうか。

まず(かっこ)で分けたいと思います

ssh root@ws02 {'echo "Hello (’\)’test(’\)’ !!" > test2.txt'}

この分け方はあってますでしょうか。。その場合(’\)が何を意味していてどういう役割を担っているのかがわかりません(泣)。恐れ入りますがご教授願います。


raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-06-05 13:09
よかった成功して。
sshで試す環境がなくてちょっと自信なかったんです(^^

分け方としてはこうです。

ssh root@ws02 {'echo "Hello ’(\’)test(\’)’ !!" > test2.txt'}

クォーテーションはシェルが特別な解釈をする文字ですが,シェルには
「\の直後の文字は特別な解釈をせず,文字そのものとして扱う」
というルールがあります。これにより,(\’)はシェルに解釈されずに
(’)そのものとしてコマンドに渡されます。

また,シングルでもダブルでも,同じクォーテーションはネストできなくて
最初の対で区切られてしまいます。
(違うクォーテーションがネストしてると,外側のほうだけ解釈される)

したがってこの引数はシェルにより
●’echo "Hello ’ → シェルが’を解釈してはずす
●\’test\’ → \’なので解釈せず’として扱う
●’ !!" > test2.txt’ → シェルが’を解釈してはずす
という操作が行われ,
echo "Hello 'test' !!" > test2.txt
という文字列としてコマンドに渡されます。

ちなみに最初の
ssh root@ws02 'echo "Hello 'test' !!" > test2.txt'

という書き方の場合は,
●’echo "Hello ’ → シェルが’をはずす
●test → 何もしない
●’ !!" > test2.txt’ → シェルが’をはずす
と操作され,コマンドに渡された時点で
echo "Hello test !!" > test2.txt
という’が消えた文字列になってしまいます。


例えばこんなスクリプトを作っていろいろ試してみるといいでしょう。
シェルがどう解釈してコマンドに渡すかわかると思います。

#! /bin/sh
echo $1

# これで「'aaa bbb'」と「aa'a b'bb」が同じ結果になる
# というのを最初に知ったときはちょっとビックリでしたよ。

McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2003-06-05 23:20
 おどろきました。。こんなに分かりやすいご説明を受けたのは初めてです。なるほどそういうことなのですね?

 大変感謝しております。ありがとうございました。またよろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)