ユーザーには、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