안녕하세요. 여기는 멍청한 취미생활자이므로 질문이 너무 단순하지는 않기를 바랍니다.
사용자 입력만 사용하여 미디어의 전체 파일 구조를 생성할 수 있는 스크립트를 작성하려고 합니다. '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
0으로 구분된 인수 목록을 생성하고, 이 문제를 해결하기 위해 필요한 만큼 자주 xargs
호출하는 데 사용할 수 있습니다 . mkdir
물론 더 적은 수의 인수와 함께 사용하는 것이 절약되므로 알 수 없는 숫자와 불쾌한 악의적인 사용자를 모두 처리하는 경우 이 방법이 좋습니다.
printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir
숫자 시퀀스가 + 1로 끝나도록 하려면 $user_input4
변수를 산술 표현식으로 바꾸십시오 $((user_input4 + 1))
. 예:
printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir
답변2
내가 아는 한, mkdir은 적어도 사용하려는 형식이 아닌 다양한 디렉터리를 허용하지 않습니다. 거의 배열처럼 계절을 생성하고 있습니다. 그러나 mkdir 명령을 사용하여 둘 이상의 디렉터리를 생성하려면 공백을 두고 한 번에 하나씩 전달해야 합니다.
user_input4에서 숫자 값을 허용하므로 while 루프를 사용하여 user_input4 값에서 0에 도달할 때까지 카운트다운을 시도할 수 있습니다.
while [ $user_input4 -gt 0 ]
do
mkdir Season${user_input4}
let user_input4=${user_input4}-1
done
user_input4가 0이면 루프가 자연스럽게 중지됩니다. 또는 숫자보다 하나 더 필요한 경우 -ge(크거나 같음)를 사용하세요. 이 방법의 유일한 문제점은 디렉토리를 역순으로 생성한다는 것입니다. 따라서 user_input4가 "3"이면 순서는 다음과 같습니다.
mkdir Season3
mkdir Season2
mkdir Season1