スクリプトでバックオートを使ってコマンドを表示する方法

このQ&Aのポイント
  • bashスクリプトでバックオートを使ってコマンドを表示する方法について説明します。
  • 現在の方法では、コマンドを実行させた後に表示させるため、スマートではありません。
  • よりスマートな方法として、コマンドの実行と表示を1行で行う方法があります。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

関連するQ&A

  • 3日以前のバックアップを削除する

    /etc/crontabで以下のbackup.shを毎晩実行するのですが、 3日以前のものは毎回消していく場合は以下のような、 少し初心者的な書き方しか現在分からないのですが、 他にもし良い書き方があれば、教えていただけますでしょうか? よろしくお願いします。 #!/bin/sh DATE_1=`date -d '1 day ago' +%Y%m%d` DATE_2=`date -d '2 days ago' +%Y%m%d` DATE_3=`date -d '3 days ago' +%Y%m%d` if [ test_$DATE_2.tar.gz ]; then mv -f test_$DATE_2.tar.gz test_$DATE_3.tar.gz fi rm -f test_$DATE_3.tar.gz if [ test_$DATE_1.tar.gz ]; then mv -f test_$DATE_1.tar.gz test_$DATE_2.tar.gz fi if [ test.tar.gz ]; then mv -f test.tar.gz test_$DATE_1.tar.gz fi tar zcvf test.tar.gz /usr/local/test

  • Bashシェルスクリプトの書き方

    Bashシェルスクリプトの書き方 ↓のx.shはどこが間違っているのでしょうか? $ cat x.sh #!/bin/bash function x() { local dir if $1; then dir=$1 else dir="." fi `find $dir -type d` } ↓こうなります $ source x.sh $ x dir dir: command not found bash: .: ./dir: はディレクトリです

  • bashのif文で構文エラー:

    bashで時間の比較によっての分岐を考えています。 ネットで検索しながらif構文を下記のようにしてみているのですが、 行 10: 構文エラー: 予期しないファイル終了 (EOF) です となってしまいます。 どなた様かお教え願えませんでしょうか #!/bin/bash DATA=`date +%-H%M` if [ $DATA -gt 600 ];then echo "$DATA" else echo "NG" fi 

  • シェルスクリプトのテスト

    年が変わるとシェルの処理も替わります。 例えば: year=`date +%Y` if [ $year=2006 ];then echo "year 2006" fi if [ $year=2007 ];then echo "year 2007" fi テストをしたいですが、 2007年のテストは出来ますでしょうか? 教えてください!お願いします。

  • bash 閏年

    shellについて初めて勉強しています。 複数のコマンドライン引数で西暦を与えると,閏年かどうか判定する bashのファイルを作成しているのですが, なかなかうまくいきません。 どのように改善したらよいでしょうか? #!/bin/bash if [ ${DATE_YYYY}%4 -eq 0 -a \ ! ${DATE_YYYY}%100 -eq 0 -o \ ${DATE_YYYY}%400 -eq 0 ] then # 閏年 else # 閏年以外 fi

  • linux シェルの変数、引数の指定について教えて

    シェルの勉強を始めまして、 ファイルを複合化、解凍するだけのシェルを作ろうと思っています。 fukugo.sh $1 でシェルを実行 /home/allday/log/upload/201701261507(←ログの作られる時間で変わります)aaaaa.tar.gz.e というファイルを$1引数に指定 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー !/bin/sh # # init CWD=$(cd $(dirname $0) && pwd) #cd ${CWD} # if [ -z $1 ] then echo "引数を指定してください" exit fi echo "Start" echo "指定されたtarファイルを複合化します" fukugo-decrypt $1 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー fukugo-decryptは私の会社で使われているtarを複合化するコマンドです(環境変数?) 複合化すると /home/allday/log/upload/201701261507aaaaa.tar.gz というファイルになります。 このできたファイルをシェルに入れる次のコマンドの引数にしたいです。 が最後の.eが無くなるため$1では指定できないと思います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー echo "複合化されたファイルを/tmpフォルダに入れておきます" mv /home/allday/log/upload/201701261507aaaaa.tar.gz /tmp/ echo "ファイルを展開します" tar zxvf /tmp/201701261507aaaaa.tar.gz echo "End" ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 複合化された後の/home/allday/log/upload/201701261507aaaaa.tar.gzや 移動後の/tmp/201701261507aaaaa.tar.gzは変数で設定するとよいと聞いたのですが、 どのように設定すればよいかわかりません。 お分かりになる方、お願いします。 教えてください。

  • Linuxのbashシェルスクリプトについて教えて下さい。

     Linux, bash超初心者です。  WindowsのAdobe Readerで印刷できないPDFを印刷しようと、Vine Linux上でpdf2psとps2pdfを組み合わせ、以下のようなスクリプトを作ってみました。 [pdfconv.sh] ----- #!/bin/sh if [$1 = ""]; then echo "Usage: ./pdfconv.sh input.pdf [output.pdf]" else file1=$1 file2=${file1%pdf}ps if [$2 != ""]; then file3=$2 else file3=${file1%.pdf}2.ps fi echo $file1' -> '$file3 pdf2ps -r1200x1200 ${file1} ps2pdf $file2 $file3 rm $file2 fi -----  引数が渡されていないとUsageを表示するようにしてみたのですが、引数を渡して $ ./pdfconv.sh test.pdf として実行すると、 ./pdfconv.sh: line 3: [test.pdf: command not found とのエラーが表示されてしまいます。処理自体には問題ないのですが、何だか気持ち悪いです。解決策を教えていただけますでしょうか。よろしくお願いします。

  • シェルスクリプトのbashとperlについて

    シェルスクリプトのbashとperlについて 今さら気づいたのですが、PerlもUNIXのコマンドやシェルスクリプトとして使用できるということでしょうか。 RubyやPHPをUNIXのコマンドやシェルスクリプトとして使用することはできますでしょうか。 学ぶとしたら、bashとPerlのどちらが良いでしょうか。 また、シェルスクリプトはどんな用途や利点がありますでしょうか。 Webアプリケーションによるバックアップやログをタイマーでセットして自動的に取得したりすることは可能でしょうか。

  • bashスクリプトについて

    #!/usr/local/bin/bash など1行目に書いてbashのスクリプトを作成したいのですが、 計算式を作りたいのですができないものでしょうか? たとえばe2pという名前で ###----------------### echo "script test" $i=1 printf $i ###----------------### として、./e2pと実行しても、script test は表示されても、以下二行はエラー ./e2p: =1: command not found ./e2p: print: command not found となって表示されませんでした。 どのようにすれば、 $a=1 $b=3 print $a+b などいったことができるのでしょうか? また、根底から間違っている気もします・・・どのようにすればよろしいでしょうか?

  • シェルでsyntax errorがでてしまう

    温度管理をするため、CentOS4.4上で下記のようなスクリプトを動かしています。 ---スクリプト始まり--- #!/bin/bash date=$(date '+%Y/%m/%d(%a)/%R') rh=$(/var/usbrh/usbrh -1 2>&1) limit=35 rh_judge=$(echo $rh | cut -c14-15) if (( ${rh_judge} >= ${limit} )) ;then alert=alert else unset alert fi echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log ---スクリプト終わり--- このスクリプトで、ログを出力し、limit以上の数値になった場合、alertがログに書き込まれるようにできました。 そこでコレを少し改良してalert時にメールを飛ばせる様にしたいと思い下記のようにif文を差し替えました。 ---if文始まり--- if (( ${rh_judge} >= ${limit} )) ;then alert=alert address="xxx@hogehoge.com" subject="TemperatureAlert" mail -s $subject $address << END `$rh` END else unset alert fi ---if文終わり--- ところが、 echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log のあとの行(line23)で line 23: syntax error: unexpected end of fileというのが出て スクリプトが動かなくなってしまいました。 ログの書き込み部分は問題ないと思うのですが、原因がわかる方いらっしゃいますでしょうか。 ご指摘頂ければ幸いです。 宜しくお願いいたします。