아마도 이것은 매우 어리석은 질문일 것이다. 저는 bash 스크립팅의 초보자인데 명령을 실행하려고 하면 제대로 작동하지 않습니다.
#!bin/bash
noise={5,10,15}dB
mkdir $(echo $noise)
{5,10,15}dB가 위치 매개변수로 제공되는 bash 스크립트에 5dB, 10dB 및 15dB의 3개 디렉토리를 생성하고 싶습니다. 스크립트는 중괄호 확장을 수행하지 않으며 폴더에 {5,10,15}dB를 제공합니다. 누가 날 도울 수 있죠? ?
답변1
먼저 변수에 저장할 필요가 없습니다. 어쨌든 중괄호는 변수 할당 오른쪽에서 확장되지 않으므로 변수는 literal 이 됩니다 {5,10,15}dB
.
다음을 수행할 수 있습니다.
mkdir {5,10,15}dB
또한 명령 대체에서 변수를 에코할 필요가 없으며 수행된 작업은 변수의 내용을 확장하는 것뿐입니다.
mkdir $(echo $noise)
다음과 다르지 않습니다:
mkdir $noise
답변2
나는 당신을 혼란스럽게 만드는 것이 확장 순서라고 생각합니다. Bash는 이를 특정 순서로 실행합니다. 첫 번째 중괄호 확장, 그 다음 변수 확장입니다. 이것이 귀하의 예에서 중괄호 확장이 작동하지 않는 이유입니다.
eval
다음을 사용하여 bash 실행 확장을 강제 할 수 있습니다 .
noise={5,10,15}dB
# BAD IDEA, FOR DEMONSTRATION PURPOSES ONLY
eval mkdir $noise
그러나 내부에 악성 코드가 있으면 악성 코드 $noise
도 실행되기 때문에 일반적으로 이는 나쁜 습관입니다.
@Archemar가 의견에서 지적했듯이대량으로더 나은 아이디어일 수도 있습니다.
noise=(5 10 15)
mkdir "${arr[@]/%/dB}"
명령줄에서 디렉터리 이름을 전달하는 경우 중괄호 확장은 스크립트 호출 시 대화형 셸에서 수행되므로 문제를 일으키지 않습니다. 즉, 다음이 작동합니다.
$ cat script.sh
#!/bin/bash
mkdir "$@"
$ ./script.sh {5,10,15}dB