こんにちは。私は単なる初心者の趣味人なので、あまり単純な質問ではないと思います。
ユーザー入力のみを使用してメディアのファイル構造全体を生成できるスクリプトを作成しようとしています。 'mkdir Season{1..$user_input4} がある 20 行目以外はすべて正常に動作しています。 ユーザー input_4 を取得して 1 + その数のディレクトリを作成したいのですが、代わりに Season{1..(ユーザー入力を印刷)} という名前のサブディレクトリが作成されるため、間違った視点から見ているように感じます。
#!/bin/bash
file_created="Directory Created"
directory_number=0
echo "How many directories should be created?"
read user_input
while [ $directory_number -ne $user_input ]
do
echo "Enter Directory Name"
read user_input2
mkdir $user_input2
directory_number=$((directory_number + 1))
echo "Do you want to create Seasons? Y/N"
read user_input3
if [ $user_input3 == "Y" ]
then
echo "Enter number of seasons"
read user_input4
cd $user_input2/
mkdir Season{1..$user_input4}
cd ..
else
:
fi
done
何かアイデアをお持ちの方がいらっしゃいましたら、ぜひ教えてください。ありがとうございます!
答え1
この方法は機能しません。理由は次のとおりです。
拡張の順序は次のとおりです。ブレース拡張; チルダ展開、パラメータおよび変数の拡張、(…)。
[man bash
、強調表示を追加]
括弧の展開は変数が展開される前に行われ、 のみが表示されますが{1..$user_input4}
、これはもちろん有効ではありません。
もう一つの起こりうる問題:$user_input4
が非常に大きい場合、とても長い超過する可能性のあるディレクトリ名のリストシェルのARG_MAX
限界、これではコマンドが失敗します。 を使用seq
して数値シーケンスを作成し、printf
を使用してゼロ区切りの引数リストを作成し、 を必要な回数だけxargs
呼び出すことでmkdir
これを回避できます。もちろん、引数の数が少ない場合にも使用するのが安全なので、未知の数と悪質なユーザーの両方に対処する場合は、これが最適な方法です。
printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir
数列を$user_input4
+ 1 で終了したい場合は、変数を算術式に置き換えます$((user_input4 + 1))
。例:
printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir
答え2
私の知る限り、mkdir は、少なくともあなたが使用しようとしている形式では、ディレクトリの範囲を受け入れません。季節をほぼ配列のように作成しています。ただし、mkdir コマンドで複数のディレクトリを作成する場合は、間にスペースを入れて一度に 1 つずつ渡す必要があります。
user_input4 で数値を受け入れるので、while ループを使用して、user_input4 の値からゼロに達するまでカウントダウンしてみることができます。
while [ $user_input4 -gt 0 ]
do
mkdir Season${user_input4}
let user_input4=${user_input4}-1
done
ループは、user_input4 が 0 になると自然に停止します。または、数値より 1 つ多い値が必要な場合は、-ge (より大きいか等しい) を使用します。この方法の唯一の欠点は、ディレクトリが逆の順序で作成されることです。つまり、user_input4 が "3" の場合、順序は次のようになります。
mkdir Season3
mkdir Season2
mkdir Season1