

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
No.1ベストアンサー
- 回答日時:
私の環境に於いて以下のコマンドを実行すると...
$ mkdir "No.01"
$ mkdir "No.01"
mkdir: ディレクトリ `No.01' を作成できません: ファイルが存在します
となり、つまりご提示の状況は重複したディレクトリ名を次々に製作しようとしている、事になります。それ故、"No.0$line"がご質問者様想定の文字列に展開されていない可能性が最も高いと思われます。
そこで、先ずはスクリプト中の"mkdir"コマンドを"echo"に置き換えて、想定した文字列が表示されるかどうか確認することから始めるべきと思います。
ありがとうございます。
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
No.5
- 回答日時:
>少し修正してみました。
仕様が変わっています。
「修正」とは呼べません。
> for((; ;))の形を使わず
この質問のスクリプトは for を使わずに書いていて、
それを「修正」してforにしたのでしょ?
なら元に戻せばいいだけです。
ありがとうございます。
No.01からNo.20のディレクトリが無い状態での実行を想定しているのなら、No.01からNo.20のディレクトリを削除してから./final.shを実行します。
あるいは、新しいディレクトリを作ってそこで実行します。
「存在しない場合は作成する」という仕様なら、そのようにします。
・test, [] 等で存在を確認し、存在しない場合だけmkdirを実行する
・mkdir の -p オプションを使って存在していてもエラーにならないようにする
↑をコードに実際に書くとどのようになりますでしょうか。
No.4
- 回答日時:
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
> 指定した名前のディレクトリが存在してもエラーメッセージを出力しない。
> 親ディレクトリが存在しない場合は、それも含めて作成する。
ありがとうございます。少し修正してみました。更に
以下のシェルスクリプトを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
・・・実行結果・・・
No.3
- 回答日時:
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*
No.2
- 回答日時:
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
となり、改行が消えてしまいます。この辺りが問題解決のヒントになるのではないかと思います。
ありがとうございます。
先ほどから少しだけ中身をかえて
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Linuxの実行結果を修正したいです。 2 2022/11/23 08:32
- Ruby 教えてください 2 2023/01/04 17:50
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- その他(プログラミング・Web制作) Arduinoに関する質問 4 2023/08/07 21:19
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- Mac OS PATHを使ってcdなどで簡単に移動できるようになりたい 3 2023/05/13 14:22
- その他(ソフトウェア) UnityのPublishing SettingsでCreate Keyを押しても反応しない 1 2023/06/27 01:03
- Ruby pythonエラー 4 2022/11/11 19:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1コールだけ鳴るけど切れる電話...
-
ラインナップとラインアップは...
-
相手側の携帯が電源切れてる時...
-
Windowsのバッチファイルで正規...
-
face book で女性の方からline ...
-
毎月記念日をlineで祝うのって...
-
遠くにいる友達とLINE交換する...
-
いきなりラインのトークに「新...
-
LINE for iPad の認証について
-
ある男子から、ライン追加され...
-
既婚女性にラインを聞くことに...
-
会社の先輩とLINE プライベート...
-
風俗に行ったとして、そこで嬢...
-
Lineを登録したことがバレました
-
生産ラインの品質を表す直行率...
-
lineのワン切り、なぜ?
-
「一番上、真ん中、下」を示す英語
-
ラインの 非表示削除について質...
-
3ヶ月前に別れた彼とはカカオト...
-
swift言語のprintln()関数で「p...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
相手側の携帯が電源切れてる時...
-
1コールだけ鳴るけど切れる電話...
-
face book で女性の方からline ...
-
ラインナップとラインアップは...
-
遠くにいる友達とLINE交換する...
-
Windowsのバッチファイルで正規...
-
よく05(04)lineって見かけるん...
-
「一番上、真ん中、下」を示す英語
-
生産ラインの品質を表す直行率...
-
python flask から fastapiへの...
-
いきなりラインのトークに「新...
-
ある男子から、ライン追加され...
-
毎月記念日をlineで祝うのって...
-
3ヶ月前に別れた彼とはカカオト...
-
タイトルの改行
-
会社の先輩とLINE プライベート...
-
まだそんなに親しくない相手と...
-
法線(normal line)はなぜそう...
-
LINEで好きな人が「笑」を全然つ...
-
2000年生まれなのですが 00line...
おすすめ情報