こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

bashスクリプト

bashスクリプト

#!/bin/bash

if [ -f *.log ]; then
 echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log`
fi

このようなスクリプトでecho ``(バックオート)でコマンドを実行できると思うんですが,
tar czf $(date +"%Y_%m_%d").tar.gz *.log←これ自体を表示できないでしょうか?

いまは,以下のようにしてコマンドを実行させ,さらに表示させています.
これだとあまり賢くないというか,1行でスマートに表示させたいのですが,
可能でしょうか?

if [ -f *.log ]; then
 echo "tar czf $(date +"%Y_%m_%d").tar.gz *.log"
 echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log`
fi

投稿日時 - 2010-09-09 00:48:10

QNo.6168902

すぐに回答ほしいです

質問者が選んだベストアンサー

その前に
ここでバッククオート使う意味、ありますか?
tarを実行するだけなら ``の中だけ書けばいいです。
また、このコマンドでは何も出力しないので``は空文字列になり、echoも何も出力しません(正確には改行だけ表示する)。

さて、御所望の方法ですが、次のようなものがあります。
1)
# 変数に入れる
com="tar czf $(date +"%Y_%m_%d").tar.gz *.log"
# 表示
echo $com
# 実行
$com

2) set -xでトレースを有効にしたサブシェルで実行
(set -x ; tar czf $(date +"%Y_%m_%d").tar.gz *.log)


あと
> if [ -f *.log ]; then
*.logに該当するファイルが複数あるとエラーになります。
なんらかの対策が必要です

例)
#!/bin/bash
#該当ファイル名をグロービングしてを配列に入れる
declare -a f=(*.log)
#該当ファイルのチェック
#存在してなければ、*.log のままか空文字列になる(オプションによる)
if [ "$f" \!= '*.log' -a "$f" \!= '' ]
then
( set -x ; ls "${f[@]}")
fi

投稿日時 - 2010-09-09 09:43:18

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

eval使えば
http://www.mazn.net/blog/2009/01/20/177.html

投稿日時 - 2010-09-09 09:23:49