質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Q&A

解決済

1回答

322閲覧

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

menma...

総合スコア2

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

0グッド

0クリップ

投稿2023/09/27 03:24

編集2023/09/27 03:26

前提

こちらの課題を出されたのですが、未経験なうえ何も教えてもらえないまま出されてしまったので自分なりに調べたり質問してやってみたのですが、なかなかうまくいきません。

該当のソースコード

#!/bin/bash #初期設定 LogPath="./log" ToDate=`date +"%y%m%d%H%M"` LogDate=`date +"%y/%m/%d %H:%M:%S"` LogName="$LogPath/script_$ToDate.log" CreDir="./result" echo "シェルスクリプトを起動しました。" #ログフォルダがあるかチェックします。 if [ ! -d $LogPath ] ; then mkdir $LogPath 格納先を作成して、 echo $LogDate ": ログファイルが作成されました" >> $LogName fi 条件分岐終了 echo $LogDate ": シェルスクリプトが開始します" >> $LogName #ファイルを作成する回数を設定します。 num=$1 #フォルダがあるかチェックします。 if [ ! -d $CreDir ] ; then mkdir $CreDir echo $LogDate ": フォルダ $CreDir が作成されました" >> $LogName else echo $LogDate ": フォルダ $CreDir は存在します" >> $LogName fi #フォルダ内の不要ファイルを削除します。 rm -f $CreDir/* #ファイルを作成します。 ((j = 1)) while ((j <= $num)); do touch $CreDir/test$j echo $LogDate ": TEST$j ファイルが作成されました" >> $LogName ((j++)) done echo $LogDate ": シェルスクリプトが終了しました" >> $LogName echo "シェルスクリプトを終了しました。"

要件
➀現在は引数として数字以外は入力できる状態であり、数字以外を入力するとスクリプトが異常となる。引数を判定して数字以外だったらエラーをログに書き込んで終了するようにする。
<ヒント>
数字の判定には正規表現というものを利用する。
終了時は「exit 100」のコマンドを使用する
if文を利用する

➁現在は引数で入力した回数まで繰り返しを行い、ファイル「Test{数字0〜引数}」を順番に作成する。繰り返し処理を利用して、ファイル「Test{数字0〜引数}_{数字1〜9}」として作成する。
現在
Test1.Test2.....
変更後
Test1_1.Test1_2.....Test1_9.Test2_1.Test2_2
<ヒント>
多重ループ処理を実装する

という課題です。

試したこと

要件➀_____________________

#ファイルを作成する回数を設定します。 num=$1 if [[ "$num" =~ ^[0-9]+$ ]] ; then echo $LogDate ": is number" >> $LogName exit 100 else echo $LogDate ": not number" >> $LogName exit 100 fi

要件➁____________________

#ファイルを作成します。 ((j = 1)) while ((j <= $num)); do ((i = 9)) while ((i <= $num)); do touch $CreDir/test$j_$i echo $LogDate ": TEST$j_$i ファイルが作成されました" >> $LogName ((j++)) done ((i++)) done

見よう見まねでこのように変更して実行してみたのですが、起動メッセージのみしか出てきません...。どのようにしたらいいでしょうか。長文で申し訳ありませんがよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/09/27 03:54 編集

while を使うのであれば以下の様になるでしょう。(元のコードでは変数 j と i を混同している様です) ((j = 0)) while ((j <= num)); do   ((i = 1))   while ((i <= 9)); do     touch $CreDir/Test${j}_${i}     echo $LogDate ": Test${j}_${i} ファイルが作成されました" >> $LogName     ((i++))   done   ((j++)) done ※ for 文の場合は以下の様になります for ((j=0;j<=num;j++)); do  for ((i=1;i<=9;i++)); do    touch $CreDir/test${j}_${i}    echo $LogDate ": TEST${j}_${i} ファイルが作成されました" >> $LogName  done done
menma...

2023/09/27 04:00 編集

for文の場合まで添えていただきありがとうございます。早速なおしてみます。
guest

回答1

0

ベストアンサー

要件➀

if の行は合ってます。つまり、数字かどうかの判定は正しいです。
間違っているのは、日本語読解力の問題でしょうか。
要件①のヒントの、

終了時は「exit 100」のコマンドを使用する

の「終了時」は、

引数を判定して数字以外だったらエラーをログに書き込んで終了するようにする。

の終了のことです。つまり「数字以外の場合」の話です。

「数字だったらどうするか」は要件に明示的に書いてないですが、数字なら処理を続けないといけないので、終了しては駄目です。それは書かなくても分かると思って書かれてないのでしょう。

②についてはコメントの通りですが、ijは間違いやすいし、ぱっと見で間違いで気づきにくいのです。
しかし「間違いやすく気づきにくい」ということを十分認識しておけば、「結果がおかしい」というときに「iとjの間違いがあるかも」とすぐに発想できます。
nmとかも同様です。

投稿2023/09/27 12:23

otn

総合スコア86316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問