dポイントプレゼントキャンペーン実施中!

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

A 回答 (2件)

その前に


ここでバッククオート使う意味、ありますか?
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
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!