Linux勉強中のハチャメチャな日々!Windowsとの違いに四苦八苦

このQ&Aのポイント
  • 最近Linuxを勉強し始め、Windowsとはまったく違う機能に四苦八苦する毎日です。
  • 質問者が作成したバックアップスクリプトについての心配があります。
  • 既存のバックアップファイルを上書きせずに警告文を表示した上でバックアップを行う設定にする方法について教えてください。
回答を見る
  • ベストアンサー

Linuxについて

最近Linuxを勉強し始め、Windowsとはまったく違う機能に四苦八苦する毎日です #!/bin/sh for i in $* do echo "copying $i" cp &i $i.bak do という引数に指定した複数のファイルのバックアップを行うスクリプトを作りました このスクリプトはあっていますか? どこか間違っていないか心配でしかたありません また、バックアップを行う際にもし既にバックアップファイルが存在する場合には 上書きをしないように、警告文を表示したあとにバックアップを行わないような設定にするにはどのようなスクリプトを足せばいいんでしょうか;; 初心者では手に負えません 親切な方のご回答をお待ちしております。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

>for i in $* でもいいのですが、ファイル名にスペースが入っているとうまくいきません。 for i in "$@" の方がいいかもしれません > cp &i $i.bak &iではなく $i ですね。 ここも、スペース等を含むファイルがあるのなら cp "$i" "$i.bak" がよいです。 > do ループなどの終了はdoneです。 > また、バックアップを行う際にもし既にバックアップファイルが存在する場合には > 上書きをしないように、警告文を表示したあとにバックアップを行わないような設定にするにはどのようなスクリプトを足せばいいんでしょうか;; cp に -i オプションを付けて、コピーするかどうか聞いてくるようにする方法があります。 もう一つは、test(省略形の [ ] )を使ってファイルがあるかどうかの確認をして、ifで分岐する方法です。 #!/bin/sh #↑に -x や -v を付けると実行の様子が表示されます #どう動いているか、一度見ることをお勧めします for i in "$@" do j="$i.bak" #コピー先 if [ \! -f "$i" ] # コピー元がファイルであるかのチェック then echo "$i is not a file." elif [ -e "$j" ] #コピー先がすでにあるかのチェック then echo "File Exists: $j" else echo "copying $i" cp "$i" "$j" fi done

参考URL:
http://www.linux.or.jp/JM/html/GNU_sh-utils/man1/test.1.html
bacqmas1
質問者

お礼

ものすごく丁寧な回答ありがとうございました。 助かりました!

関連するQ&A

  • Linuxについて

    Linuxのスクリプトについて Linuxのスクリプトについての質問です #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done という引数に応じてカレンダーを出力するスクリプトを作成しました。 このスクリプトは引数が2つの場合は、1年ごとのカレンダーが表示されます。 ここに、引数が2つより少ないときはエラーメッセージを出力してプログラムを終了する機能をつけたいのですが 方法がよくわかりません。 #!/bin/bash # 実行時に指定された引数の数、つまり変数 $# の値が 3 でなければエラー終了。 if [ $# -ne 3 ]; then echo "指定された引数は$#個です。" 1>&2 echo "実行するには3個の引数が必要です。" 1>&2 exit 1 fi # ヒアドキュメントでメッセージを表示する。 cat <<__EOT__ 指定された引数は、 $1 $2 $3 の$#個です。 __EOT__ exit 0 このスクリプトをなんとか応用すればできると思うのですが なにせ初心者なもので;; ちょっと複雑になるとすぐに頭が混乱してしまう所存です・・・ どなたかご親切な方のご回答をお待ちしています。

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • Linuxのシェルスクリプトについて

    最近Linuxの使い方を勉強し始めたのですが シェルスクリプトについてわからないところがあるので教えてください。 カレンダーを出力するスクリプト #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done というcal.shという名前のスクリプトを作りました。 ./cal.sh x y z (x,yは年数、zは何年飛ばしで表示するかを指定する引数です) と実行すると問題なくカレンダーが表示されるのですが x,y,zの値に不適切な入力値がある場合や、引数の数が2つより少ない場合 使い方を示すメッセージを出力してプログラムを終了するようにしたいです どうすればいいのかわかりません。 本当に困っています。 親切な方のご回答をお待ちしています。

  • シェルスクリプトで引数をファイル名に使うには?

    シェルスクリプトでutfとshift-jisの変換を行いたいと思ってます。 ファイル出力のところでファイル名を$1と引数にするとうまくいきません。(変換されてなかったり、空ファイルできたり) >! $1 ではなく $1.xx とかにするとうまくいきます。 どうしたら引数のファイル名に出力できるでしょうか? #!/bin/sh if [ $2 = 'us' ] then cp $1 $1.utf8 iconv -f UTF-8 -t SHIFT-JIS $1 >! $1 echo "$1 UTF-8 => SHIFT-JIS [ OK ]" elif [ $2 = 'su' ] then cp -f $1 $1.sjis iconv -f SHIFT-JIS -t UTF-8 $1 >! $1 echo "$1 SHIFT-JIS => UTF-8 [ OK ]" else echo "$1をコンバートできませんでした。" fi

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • Linuxのtxtファイルへの出力

    こんにちは。 Linuxのファイル出力について質問があります。 #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done というcalスクリプトを作りました。 実行するとカレンダーがコンソールのほうに出力されるのですが この出力先を「cal-年.txtファイル」という テキストファイルに変更するにはどうすればいいのでしょうか?

  • 実行中のシェルスクリプト自体を修正した場合の動作

    シェルスクリプトで自分自身を削除するような構文を組んだとしても最後まで実行されました。 しかし、自分自身に別の同名ファイルを上書きコピーした場合は、 中途半端にコピー後のシェルが実行されました。 お聞きしたいのは、  ・「削除した場合でもスクリプトは最後まで実行される」という認識は正しいのか  ・コピーした場合はどうなるのか の2点です。 今回試したところ、コピーした場合は2行目の途中からコピー後のスクリプトが実行されたのですが、 これはマシンのスペックによるのでしょうか? 「コピーした場合はどうなるのかわからない」と判断した方がよいでしょうか? 現在、自分自身を修正するようなスクリプトを作成したいのですが、 上記認識で作ってよいのかどうか迷っています。 よろしくお願いします。 ▼以下、今回試した内容です。 goというスクリプトを作成しました。  #!/bin/bash  rm -rf ./go  echo "1"  echo "2"  echo "3"  echo "4"  echo "5" のように書かれています。 これをカレントディレクトリで ./go のように実行します。 実行結果は特にエラーメッセージも出ず、 goスクリプトは消え、1~5がコンソールに表示されました。 ファイル自体を削除されてもスクリプトを終えるまではコマンドは生きているように見えます。 上記goファイルのrm -rf ./goを、  cp -rf ../go . に修正し、 上の階層に同名のgoスクリプトを用意します。 こちらのgoには  #!/bin/bash  cp -rf ../go .  echo "A1"  echo "A2"  echo "A3"  echo "A4"  echo "A5" と書いています。 この状態で、最初の階層でgoを実行します。 最初の実験結果から、  ・カレントのgoの内容は上の階層のgoをコピーされたもの(echo "A1"~の方)になる。  ・コンソールには1~5が表示される と考えました。 実際は、当然goファイルは上の階層のgoをコピーしたものになりましたが、 コンソールには、 ./go: A1: command not found A2 A3 A4 A5 と表示されました。 2行目の途中から、上の階層のgoの内容が実行されているように見えます。 また2回目の環境でコードを、  #!/bin/bash  rm -rf ./go  cp -rf ../go .  echo "1"  echo "2"  echo "3"  echo "4"  echo "5" にした場合は、コンソールに表示されたのはA1~A5ではなく1~5でした。 ▲上記が試した内容です。

  • シェルスクリプトの質問です

    シェルスクリプトの質問です 質問が連続してしまい、もうしわけございません。 1番目から13番目までの引数を表示させようと思い for i in `1 13` do eval echo '$'$i done をかいたのですが、10番目からは不正確になってしまいます。どうしてでしょうか? どなたかご教授お願いいたします。

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • 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 とのエラーが表示されてしまいます。処理自体には問題ないのですが、何だか気持ち悪いです。解決策を教えていただけますでしょうか。よろしくお願いします。