シェルスクリプトが正常に動作しない
- fileフォルダ内のファイルをリネームするシェルスクリプトが正常に動作しない
- Mac OS Xでは問題なく動作するが、Webサーバ上で動作させるとエラーが発生する
- 連番でファイル名を変更する方法についてアドバイスを求めている
- ベストアンサー
シェルスクリプトがちゃんと動かない
よろしくおねがいします。 fileフォルダに 1.txt 2.txt 3.txt というファイルがあり、ここから1.txtを別フォルダに移動します。 (ここまでは問題ありません) その後fileフォルダには 2.txt 3.txt というファイルが残るのですが、このファイル名を自動的に 1.txt 2.txt と連番でリネームしたく #!/bin/sh declare -i i=1 for file in *.txt do mv $file $i.txt i=i+1 done をhoge.shとして準備しました。 Mac OS X(Darwin)では思い通りに実行されるのですが、Webサーバ(FreeBSD 6.1-RELEASE-p21)にアップし %sh hoge.sh とすると declare: not found となり、ファイルの方も .txt i+1.txt の2ファイルになってしまいます。 あまり知識も無く勉強しながらなのですが、きちんと連番で書き換えられるようにするにはどうすればよろしいでしょうか? 根本的に間違ってる事などあるかと思いますがよろしくおねがいします。
- ssc5687
- お礼率100% (2/2)
- BSD系OS
- 回答数2
- ありがとう数9
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
それは/bin/shの機能を超えた Darwinのシェルの拡張機能を使っているからでしょう。 また、ファイルが10個以上あると for file in *.txt では 1.txt 10.txt 11.txt 2.txt 3.txt・・・ という順序で処理されてしまいます。 とりあえず man sh を全部読破すれば理解できると思いますよ。
その他の回答 (1)
- SAYKA
- ベストアンサー率34% (944/2776)
シェル上ではそのまま演算式を書いても文字列として扱われるみたいだよ http://www.google.co.jp/search?q=sh%20%E6%95%B0%E5%80%A4&hl=ja&lr=lang_ja ・・・expr ・・・かな?
お礼
ありがとうございました。 他にも間違いがありそうなので、引き続き調べていきたいと思います。
関連するQ&A
- 複数ファイルを1つにするシェルスクリプト
file.1 file.2 ..... file.xx とxxが連番になっている複数のテキストファイルがあります。 これを1つのファイル"file.all"にするために以下のシェルスクリプトを作ってみました。 (公開するのも恥ずかしいのですが...^ ^;) #!/bin/sh i=1 while [ $i -le 99 ]; do cat file.$i >> file.all let i=i+1 done これだと99までのファイルしか指定できません。 99999...とループ回数を増やせばいいのですが、 それよりももっとスマートにやる方法があるのではと思い質問を投稿いたしました。 シェルスクリプトではなくコマンドによる方法でも結構です。 (RH7.3を使っています) よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- シェルスクリプトについて
bangou.txtには ▲ 123123 123123 100000 ▲ ▲ というように数値が入っています。(▲は空白ですが改行コードがはいってます) この場合、1行目と3行目を比較するスクリプトを作りたいと思って 色々調べて以下のようなスクリプトを作ってみましたけどうまく動きません。 #!/bin/bash for iii in `sed -n '1p' bangou.txt` do jjj=`sed -n '2p' bangou.txt` kkk=`sed -n '3p' bangou.txt` #declare -i $kkk if [ "$kkk" = "$iii" ] then echo "$iii" else echo "$kkk" fi done どこか基本的なところで間違えているのかと思うのですが初心者なので よくわかりません。 わかる方がいらっしゃったら教えていただけないでしょうか。
- ベストアンサー
- Linux系OS
- シェルスクリプトの問題で困っています!
シェルスクリプトの問題を解いているのですが、いまいち分かっていないところが多いです… X 年からY 年までのカレンダーをファイル(cal-年.txt)に出力するシェルスクリプト(mkcal.sh)を 作成せよ。 実行書式./mkcal.sh x y [必須項目] 1. ファイル作成と同時にメッセージを出力し,作成したファイルが分かるようにすること。 出力例 ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt Making cal-2012.txt 2. 作成しようとしているファイル(cal-XXXX.txt)が既に存在する場合には,エラーメッセージ File exists: cal-XXXX.txt を表示して,ファイルを作成しないこと。 出力例(cal-2011.txt が存在する場合) ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt File exists: cal-2011.txt Making cal-2012.txt [自由項目] 1. mkcal.sh の引数を3 つ与えて実行すると,z 年飛ばしでカレンダーを出力すること。 実行書式./mkcal.sh x y z という問題に対し #!/bin/sh n=$1 while [ $n -le $2 ]; do echo "Making cal-$n.txt" /usr/bin/cal $n > cal-$n.txt n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + $3` done とやっているのですが、どこで保存をすればいいか、そもそもの保存をするコマンドが分かっていない、これは合っているのか…と色々と問題点があります 誰か助けてください…お願い致します
- 締切済み
- その他(学問・教育)
- HTML文字列を取得→加工→書き出すスクリプト
CGI(perl)がこういうHTMLを書き出すのですが、 <html> <body> <p><a href="file:///C:\temp\hoge1.txt">file:///C:\temp\hoge1.txt</a></p> <p><a href="file:///C:\temp24\hoge2.txt">file:///C:\temp24\hoge2.txt</a></p> :(中略) <p><a href="file:///C:\temp78\hoge15.txt">file:///C:\temp78\hoge15.txt</a></p> </body> </html> ↑のハイパーリンクに加え、hoge.txtが置かれている親フォルダへの リンクも併設したいです。イメージとしては、次のような感じです、 <html> <body> <p><a href="file:///C:\temp\hoge1.txt">file:///C:\temp\hoge1.txt</a><br> ↑のファイルがあるフォルダを開くなら<a href="file:///C:\temp\">こちら</a></p> <p><a href="file:///C:\temp24\hoge1.txt">file:///C:\temp24\hoge1.txt</a><br> ↑のファイルがあるフォルダを開くなら<a href="file:///C:\temp24\">こちら</a></p> :(中略) <p><a href="file:///C:\temp78\hoge15.txt">file:///C:\temp78\hoge15.txt</a><br> ↑のファイルがあるフォルダを開くなら<a href="file:///C:\temp78\">こちら</a></p> </body> </html> みたいに、ページを表示するたびに フォルダパスも記述されるという… JavaScriptで実現できますでしょうか?よろしくお願い致します。
- ベストアンサー
- JavaScript
- シェル ファイルの中身によって特定の処理
シェルスクリプトに関する質問です。 少しシェルで言語風なものを作ってみようと思い、作成したのですが、上手くいかないので質問させて頂きました。内容は、特定の文字がファイルに記載されているか判定して、 特定の文字だったら処理をするというものです。 現在、このようなソースになっています↓ #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 line=$(wc -l ${file_name}) #行数をlog.txtへ書き込む echo ${line} > log.txt #行数以外にファイル名があるので削除 sed -i "s/$file_name//g" log.txt #行数を格納 Line=$(cat log.txt) i=0 #全ての行を変数へ格納 #ここが問題 配列に変数が使えない!? while [ $i = ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) expr `${i} + 1` done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる b=0 while [ $b = ${main_file} ] do if [ array[$b] = "hello" ] then echo "hello" fi expr `$b + 1` done ここで、配列を利用し、変数への代入が出来ませんでした。 ただ、エラーは表示されません。。。 環境はUbuntu10.10です。 何もいじっていないので、たぶん大丈夫だと思うんですが・・・ 何か解決策はありませんか? また、コレよりいい方法などがあればぜひ教えてください。
- 締切済み
- その他(プログラミング・開発)
- Bシェルで不定変数名を変数として取り扱うには
ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt
- ベストアンサー
- その他(プログラミング・開発)
- シェルスクリプトの関数
#!/usr/bin/bash SOURCEBASE="`echo \"$1\" | sed 's/\.[^.]*$//'`" DOCLEAN='no' # 「-c」オプションで削除するファイルの拡張子一覧 CLEANEXTS='aux log toc lof lot bbl blg idx ind ilg' show_help() { cat <<EOF autolatex [options] latex-source[.tex] -c Clean temporary files before typesetting EOF exit 1 } do_clean() { for ext in $CLEANEXTS; do if [ -f ${SOURCEBASE}.${ext} ] ; then echo "hoge1" echo ${SOURCEBASE}.${ext} rm ${SOURCEBASE}.${ext} fi done } if [ $# -eq 0 ] ; then show_help exit 1 fi while getopts c: flag; do case ${flag} in c) DOCLEAN='yes';; \?) exit 1;; esac done do_clean #if [ ${DOCLEAN} = 'yes' ] ;then # # echo "hoge2" # do_clean #fi やりたいこととしては*.auxや*.logファイルを-cのオプションをつけた時に削除されることです. とりあえず手始めに取り合えず動くかの確認をしました $ bash test.sh hoge.tex hoge1 hoge.aux hoge1 hoge.log 次にコメントアウトしている部分を取り除いて(さらにその上にあるdo_cleanもコメントアウトします) #do_clean if [ ${DOCLEAN} = 'yes' ] ;then echo "hoge2" do_clean fi $ bash test.sh -c hoge.tex hoge2 同様に実行しました.結果は上のようになりif分はtrueで認識されているのですが,その次のdo_cleanでecho部分でのhoge1が表示されません. if分で分岐させている時は関数を別の呼び方で呼ばないといけないのでしょうか? さらに, do_clean if [ ${DOCLEAN} = 'yes' ] ;then echo "hoge2" # do_clean fi このようにしても結果は変わりませんでした. (オプションでなにか気をつけなければならない?) オプションをつけたときだけ該当するファイルを削除したいです,ご教授ねがいます><(なお空白はすべて全角空白になっています)
- ベストアンサー
- その他(プログラミング・開発)
- 特定ディレクトリ以下の複数のフォルダ名とファイル名を一括で連番にするバッチの作成
特定のフォルダ(ディレクトリ)以下の複数のフォルダ名とファイル名を 一括で連番にしてくれる方法(連番+拡張子のリネーム)を教えてください。 ソフトでは簡単ですが*.bat ファイルで実行するスクリプトを 知りたいので宜しくお願い致します 例えば フォルダ0 ├フォルダ1 │ ├ a.txt │ ├ b.jpg │ └ フォルダ2 │ └c.exe └ フォルダ3 └ d.exe という構造があったとして 000000 ├000001 │ ├ 000000.txt │ ├ 000001.txt │ └ 000000 │ └000000.txt └ 000002 └ 000000.txt この様に特定ディレクトリ以下の複数のフォルダ名とファイル名を連番 (上記は6桁ですが001,002…など3桁などに対応できる)にしたいのです 以下の方法で特定のフォルダ内のファイルを.txtに変更まではできましたが、 特定のフォルダより下層のファイルを.txtに変更はできませんでした。 REN E:\フォルダ\フォルダ\*.* *.txt 上記のスクリプトは特定フォルダにあるファイルは拡張子の変更が出来ますが、 そのフォルダより下層の複数のフォルダ名とファイル名の拡張子の変更をできないので、 *.batファイルで連番+拡張子のリネームを一括でするスクリプトの明記をお願い致します。 ご存知の方、どの様なご意見でも構いませんので ご回答頂けると幸いです。宜しくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- バッチファイルでのリネームについて
当方WinXPです。 いろいろ調べたのですが、自分のやりたい形での紹介は見つけられなかったので質問させてください。 aaa001.txt aaa002.txt aaa003.txt、のように連番になっているファイルを、 abc001.txt abc002.txt abc003.txt、のように別の連番にリネームするバッチを作りたいんですが、やり方がわかりません。 その場限りではなくて、何回も使いまわせるようにしたいです。 ちなみにやりたい作業内容としては 1:連番のファイルの名前を別の連番にリネーム。 ↓ 2:リネームしたファイルを結合。 ↓ 3:元のファイルを消去。 という感じで、2~3は自力で出来そうなのですが、1の作業ができないので困っています。 分かりにくい質問で申し訳ないですが、是非教えてくださると嬉しいです。 よろしくお願いします。
- ベストアンサー
- その他(インターネット・Webサービス)
- シェルで一行一行読み込む
いつもお世話になっております。 標題の通り、シェルで一行一行読み込で出力する方法をご教授願えないでしょうか [sh] #!/bin/bash cat test.txt | while read line do echo $line done [test.txt] /usr/hoge/hoge1/hoge2/hoge3/hoge4/index.html /usr/hoge1/hoge1/hoge2/hoge3/hoge4/index.html /usr/hoge3/hoge1/hoge2/hoge3/hoge4/index.html 通常echo $lineにしていれば、text.txtの内容が出力されるのですが、 加えて、ls -l コマンドも実行したいのですが、うまくいきません [したいこと] /usr/hoge/hoge1/hoge2/hoge3/hoge4/index.html -rw-rw-r-- 1 hoge hoge 7536 3月 16 16:15 /usr/hoge/hoge1/hoge2/hoge3/hoge4/index.html /usr/hoge/hoge1/hoge2/hoge3/hoge4/index.html -rw-rw-r-- 1 hoge hoge 7536 3月 16 16:15 /usr/hoge1/hoge1/hoge2/hoge3/hoge4/index.html よろしくおねがいします
- 締切済み
- その他(プログラミング・開発)
お礼
なるほど。Darwinでの動作が特別だったのですね。 処理順についても大変参考になりました。 シェルスクリプトを利用して今まで面倒だった事が色々出来そうなのですが、なかなか大変です。 man shも参照しましたが英語に疎いので、、、 今日は朝からトライしていたので、明日本屋に直行しようと思います。 ありがとうございました。 (締め切りはもう少し先にさせてください)
補足
追記 やはり自分の知識ではまだまだ追いつかなかったので、個別に mvという方法にしました。 ファイル数もあまり無いですし、順序の問題もクリアされて無事検証も出来ました。 とりあえず動かす分には完璧なので、今後勉強していきながら、もっと良い書き方を覚えていこうと思います。 本日で閉め切らせていただきます。 ありがとうございました。