秘密基地、どこに作った?

No.1~20の連番ディレクトリ生成を作成しています。
実行結果がうまくできていないかと思うのですがどのように修正したらよろしいのでしょうか。具体的に修正をお願いします。

$ vim final.sh
$ chmod +x final.sh
$ ./final.sh
mkdir: cannot create directory 'No.01': File exists
mkdir: cannot create directory 'No.02': File exists
mkdir: cannot create directory 'No.03': File exists
mkdir: cannot create directory 'No.04': File exists
mkdir: cannot create directory 'No.05': File exists
mkdir: cannot create directory 'No.06': File exists
mkdir: cannot create directory 'No.07': File exists
mkdir: cannot create directory 'No.08': File exists
mkdir: cannot create directory 'No.09': File exists
mkdir: cannot create directory 'No.10': File exists
mkdir: cannot create directory 'No.11': File exists
mkdir: cannot create directory 'No.12': File exists
mkdir: cannot create directory 'No.13': File exists
mkdir: cannot create directory 'No.14': File exists
mkdir: cannot create directory 'No.15': File exists
mkdir: cannot create directory 'No.16': File exists
mkdir: cannot create directory 'No.17': File exists
mkdir: cannot create directory 'No.18': File exists
mkdir: cannot create directory 'No.19': File exists
mkdir: cannot create directory 'No.20': File exists
$ cat final.sh
#!/bin/bash

seq 20 | while read line
do
if [ $line -lt 10 ]
then
mkdir "No.0$line"
else
mkdir "No.$line"
fi
done

A 回答 (6件)

私の環境に於いて以下のコマンドを実行すると...



$ mkdir "No.01"
$ mkdir "No.01"
mkdir: ディレクトリ `No.01' を作成できません: ファイルが存在します

となり、つまりご提示の状況は重複したディレクトリ名を次々に製作しようとしている、事になります。それ故、"No.0$line"がご質問者様想定の文字列に展開されていない可能性が最も高いと思われます。

そこで、先ずはスクリプト中の"mkdir"コマンドを"echo"に置き換えて、想定した文字列が表示されるかどうか確認することから始めるべきと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Echoにするとうまく表示できました。
これから要件を満たすにはどうしたらよいのでしょうか。

$ vim final.sh
$ chmod +x final.sh
$ ./final.sh
No.01
No.02
No.03
No.04
No.05
No.06
No.07
No.08
No.09
No.10
No.11
No.12
No.13
No.14
No.15
No.16
No.17
No.18
No.19
No.20

お礼日時:2022/11/22 13:22

どのような動作を期待しているのか, 明確に書いてほしいねぇ....



mkdir No.{01..20}
    • good
    • 0

>少し修正してみました。



仕様が変わっています。
「修正」とは呼べません。

> for((; ;))の形を使わず

この質問のスクリプトは for を使わずに書いていて、
それを「修正」してforにしたのでしょ?
なら元に戻せばいいだけです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
No.01からNo.20のディレクトリが無い状態での実行を想定しているのなら、No.01からNo.20のディレクトリを削除してから./final.shを実行します。
あるいは、新しいディレクトリを作ってそこで実行します。

「存在しない場合は作成する」という仕様なら、そのようにします。
・test, [] 等で存在を確認し、存在しない場合だけmkdirを実行する
・mkdir の -p オプションを使って存在していてもエラーにならないようにする

↑をコードに実際に書くとどのようになりますでしょうか。

お礼日時:2022/11/23 17:40

mkdir: cannot create directory 'No.01': File exists


 は、
mkdir: ディレクトリ `No.01' を作成できません: ファイルが存在します
 と同じです。メッセージが元のままなのか日本語訳なのかの違いです。

mkdirは、作ろうとしているディレクトリと同名のディレクトリまたはファイルが既に存在するときには、エラーになります。
その際に、上記のエラーメッセージを出力します。


どんな課題か書いてないので違うかもしれませんが。

No.01からNo.20のディレクトリが無い状態での実行を想定しているのなら、No.01からNo.20のディレクトリを削除してから./final.shを実行します。
あるいは、新しいディレクトリを作ってそこで実行します。

「存在しない場合は作成する」という仕様なら、そのようにします。
・test, [] 等で存在を確認し、存在しない場合だけmkdirを実行する
・mkdir の -p オプションを使って存在していてもエラーにならないようにする

https://linuxjm.osdn.jp/html/GNU_fileutils/man1/ …
> -p, --parents
> 指定した名前のディレクトリが存在してもエラーメッセージを出力しない。
> 親ディレクトリが存在しない場合は、それも含めて作成する。
    • good
    • 0
この回答へのお礼

ありがとうございます。少し修正してみました。更に
以下のシェルスクリプトをfor((; ;))の形を使わずに修正するとどのように
書けますでしょうか。宜しくお願いします。

$ vim test.sh
$ cat test.sh
#!/bin/bash

for((i=1;i<=$1;i++));do
no="0$i"
if [ -d "./No.${no: -2}" ]; then
echo "No.${no:-2} Directory already exists!" 1>&2
else
mkdir "./No.${no: -2}"
fi
done

$ chmod +x test.sh
$ ./test.sh 20
・・・実行結果・・・

お礼日時:2022/11/23 10:55

No1です。


私はcshしか解らないのでcshで試してみましたが、次のスクリプトで特に問題なくディレクトリを作成できました。

$ cat test
#!/bin/csh -f

set num = `seq -w 20`
set label = "No."

foreach dir ( $num )
set name = `echo $label``echo $dir`
mkdir $name
end

$ ./test
$ ls
No.01/ No.04/ No.07/ No.10/ No.13/ No.16/ No.19/
No.02/ No.05/ No.08/ No.11/ No.14/ No.17/ No.20/
No.03/ No.06/ No.09/ No.12/ No.15/ No.18/ test*
    • good
    • 0
この回答へのお礼

ありがとうございます。
bash環境ですとうまくできませんでした...

お礼日時:2022/11/22 22:47

No1です。


ごめんなさい。先程の回答は明確に誤りが含まれますね。お詫びして訂正いたします。

私の環境に於いて以下を実行すると...

$ seq 20
1
2
3
4
5

となり、改行が入ってしまうことに注目します。一方、私の環境(csh)に於いて次に示すコマンドでは...

$ set Line = `seq 20`
$ echo "$Line"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

となり、改行が消えてしまいます。この辺りが問題解決のヒントになるのではないかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
先ほどから少しだけ中身をかえて
trkaさん指摘をもとに修正したみたつもりですが。。。
どのように訂正したらよろしいのでしょうか。
具体的に教えていただけると幸いです。
$ vim final.sh
$ chmod +x final.sh
$ ./final.sh
No.01
No.02
No.03
No.04
No.05
No.06
No.07
No.08
No.09
No.10
No.11
No.12
No.13
No.14
No.15
No.16
No.17
No.18
No.19
No.20
[education@centos-rpi3 ~]$ cat final.sh
#!/bin/bash

seq -w 20 | while read line
do
set Line = 'seq 20'
echo "No.$line"
done

お礼日時:2022/11/22 13:49

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


おすすめ情報