사용자에게는 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