質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

38516閲覧

引数にエスケープ文字を含むシェルスクリプトがうまく作れません

th1209

総合スコア40

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

1グッド

1クリップ

投稿2016/02/29 05:21

いつもお世話になっています。
現在、業務で緊急で必要となるシェルスクリプトを作成しております。
当シェルスクリプトですが、引数にエスケープ文字を含むものとなっており、
*(アスタリスク)を引数に含むケースで、うまくいきません。

シェルスクリプトの内容と実行結果を以下に掲載しますので、
どなたか詳しい方、ご教授いただけますでしょうか。よろしくお願いします。

以下、作ったシェルスクリプトです
(説明のため簡略化してあります)
bulkUpdateSchecule.sh

for file in `ls`; do tdUpdate="td sched:update ${file} -s \"$1\" -d sample_db -t 'Asia/Tokyo' -T presto" echo ${tdUpdate} done

以下、実行例です
(crontabコマンドの引数と同じ形式で、スケジュール日時を渡すスクリプトとなっています)

sudo sh sample.sh "59 * * * *"

上記スクリプトを実行しますと、アスタリスクの部分に、変数fileの内容が格納されてしまいます。
「呼び出し側でアスタリスクをエスケープしてみる」「シェルスクリプト内で置換処理を埋め込む」などしましたが、どうもうまくいきません...。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

echo ${tdUpdate} で「*」が展開されているのではないでしょうか。
echo "${tdUpdate}" と変数を「"」ダブルクォートでくくるとどうですか?

投稿2016/02/29 06:33

TaichiYanagiya

総合スコア12141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

th1209

2016/02/29 15:41

TaichiYanagiyaさん 教えて頂きありがとうございます。 こちらの方法で試してみたところ、上手く*が展開されずに、コマンドを実行することができました!急ぎの案件だったので、教えて頂き助かりました。 ただ、シェルスクリプトに対する理解不足のせいか、皆さんに教えていただいた内容は、よく理解できていない状態です...。 今後シェルスクリプトを使う機会が結構出てきそうなので、基礎知識の補充を行いたいなと思います!
guest

0

ダブルクォートで囲むと展開されないので、連結すればいいですよ。

sh

1V="59 * * * *" 2R="td sched:update ${file} -s \"""$V""\" -d sample_db -t 'Asia/Tokyo' -T presto" 3 4echo "$R"

投稿2016/02/29 06:05

編集2016/02/29 06:15
ogaaaan

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

th1209

2016/02/29 15:37

ogaaaanさん 教えて頂きありがとうございます。 試してみたのですが、先ほどと同じく、Cron Invalid cron specificationエラーが出てしまいました...。 シェルスクリプトに対する理解が甘いせいか、何か間違ったことをしているのかもしれません。TaichiYanagiyaさんの方法で解決できたのですが、こちらの方法でもうまくいかないか、もう少し試してみますね。
guest

0

\ をつけてみてはいかがでしょうか?

sudo sh sample.sh "59 \* \* \* \*"

投稿2016/02/29 05:37

youji

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

th1209

2016/02/29 06:02

youjiさん ご連絡頂きありがとうございます。 上のパターンで実行した場合、 何故かエスケープされず、バックスラッシュとアスタリスクが別々のものとして扱われてしまい上手くいきません...。 (具体的には、Cron Invalid cron specificationといったようなエラーが出てしまいます) 他に良い方法があれば、教えていただけますと幸いです...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問