ユーザーが入力した名前と番号でフォルダを作成する方法

ユーザーが入力した名前と番号でフォルダを作成する方法

ユーザーには、2つの変数、つまりフォルダ名と作成するフォルダの数を尋ねるメッセージが表示されます。したがって、ユーザーがseaと3を入力した場合、出力はsea、sea2、sea3でなければなりません。

read -p "Enter the name of the folder: " NAMEFOLDER
read -p "How many copies of this folder do you want?: " NUMFOLDER

i=0

until [ $i -gt $NUMFOLDER ]

do
mkdir $(($NAMEFOLDER))
((i=i+1))
done

その後、この問題が発生しました。

"mkdir: cannot create directory ‘0’: File exists"

私はこの問題に閉じ込められています。

答え1

まず、スクリプトの実行中に入力を読み取らないでください。これは、タイプミスが避けられず修正するのが難しいため、ユーザーが使いにくく、作業を簡単に繰り返して自動化することができないという意味でもあります。代わりに、名前と番号をコマンドライン引数として渡してください。

第二に、ローカルシェル変数名に大文字を使用するのは間違ったコーディングスタイルです。慣例によっては、グローバル環境変数は大文字であるため、予期しない命名競合とデバッグしにくい問題が発生する可能性があるためです。

今、実際の問題は、$((foo))foo数式で処理して結果を返す」という意味を使用していることです。たとえば、

$ echo $((4 + 3 ))
7

もちろん、同じ名前の複数のファイルやディレクトリを作成できないため、スクリプト全体も意味がありません。カウンターを追加したいですか?

たぶん、次のようなものがあります。

#!/bin/bash

folderName="$1"
folderNumber="$2"

for((i=1; i<=$folderNumber; i++)); do
  mkdir -p "$folderName"_$i
done

次のように実行します。

foo.sh bar 4

結果は次のとおりです。

$ ls
bar_1  bar_2  bar_3  bar_4

サフィックスなしで最初のディレクトリを作成するには、次の手順を実行します。

#!/bin/bash

folderName="$1"
folderNumber="$2"

mkdir -p "$folderName"
for((i=2; i<=$folderNumber; i++)); do
  mkdir -p "$folderName"_$i
done

結果:

$ foo.sh bar 4
$ ls
bar  bar_2  bar_3  bar_4

関連情報