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

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

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

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

1回答

1696閲覧

shell scriptでコマンドの引数として渡す文字列を変数でセットする方法

tami-tama

総合スコア7

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2018/05/16 10:25

NASのバックアップのためにshell scriptにてrsyncコマンドによる自動バックアップを考えています。

自動化のために作成したスクリプトは次のような感じです。

Bash

1rsync -a --delete /usr/DATA/ /usr/backup/DATA_wk1/ --log-file=/usr/log/`date +"%Y%m%d"`.log --log-file-format="%o %f"

記述が長いため、次のように変数化してみました。

Bash

1option='-a --delete' 2currentpath='/usr' 3targetpath='/usr/backup' 4logpath='--log-file=/usr/log' 5logfile=`date +"%Y%m%d.log"` 6logformat='--log-file-format="%o %f"' 7rsync $option $currentpath/DATA $targetpath/DATA_wk1/ $logpath/$logfile $logformat

このスクリプトを実行したところ次のエラーが出ました。

Unexpected remote arg: /usr/backup/DATA_wk1/

いろいろ試してみたところ、--log-file-formatに渡すフォーマット文字列%o %fがうまく処理できないようです。
下記のように記述した場合は問題なく動作します。

Bash

1option='-a --delete' 2currentpath='/usr' 3targetpath='/usr/backup' 4logpath='--log-file=/usr/log' 5logfile=`date +"%Y%m%d.log"` 6rsync $option $currentpath/DATA $targetpath/DATA_wk1/ $logpath/$logfile --log-file-format="%o %f"

変数を用いて文字列引数を渡すにはどのようにすれば良いのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

シェルが、変数の展開処理と、引用符の処理の順番の問題です。変数展開後には引用符処理がなされませんので、そのままではrsyncに渡される引数は、

Plain

1[1] -a 2[2] --delete 3[3] /usr/DATA 4[4] /usr/backup/DATA_wk1/ 5[5] --log-file=/usr/log/20180517.log 6[6] --log-file-format="%o 7[7] %f"

となり、エラーですね。

Bash

1eval rsync $option $currentpath/DATA $targetpath/DATA_wk1/ $logpath/$logfile $logformat

としてください。evalでコマンドライン処理を二重に行いますので、変数展開後に(二度目の)引用符処理が行われ、その後で引数分解が行われます。

投稿2018/05/16 15:17

otn

総合スコア84489

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

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

tami-tama

2018/05/17 05:36 編集

shell scriptを作成するのが初めてだったため、実行順序がどのように処理されるか教えていただき非常に勉強になりました。evalを適用したスクリプトで改めて実行したところ、問題なく動作しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問