여러 가지 이유로 여러 문자열(문자열에는 여러 단어가 포함될 수 있음)을 명령줄 입력으로 사용해야 합니다. 예를 들어,
./temp.sh "OS Lab" "Mad man" "Spiky Boii"
그러나 나는 위의 내용을 달성할 수 없었으므로 내가 작성한 다른 모든 것을 테스트해야 합니다.
while read -r line
do
array=("${array[@]}" "$line")
done
이제 위의 코드는 요청된 코드가 아니기 때문에 내가 원하는 작업을 수행하며 유사한 기능을 얻기 위해 이를 사용하려고 노력해 왔습니다.
for i in $*
do
array=("${array[@]}" "$i")
done
하지만 초기 입력을 제공하면 이 코드에는 6개의 배열 요소가 필요합니다. 어떻게 얻을 수 있나요?
array[0]="OS Lab"
array[1]="Mad man"
array[2]="Spiky Boii"
답변1
다음 으로 변경 $*
하고 $@
인용하세요.
for i in "$@"
do
array+=("$i")
done
또는 간단히 다음을 수행할 수도 있습니다.
for i
do
array+=("$i")
done
또한 각 반복에 배열의 나머지 부분을 포함할 필요가 없다는 점에 유의하세요. +=
매번 완전히 재설정하는 대신 배열에 요소 추가를 사용할 수 있습니다 .
하지만당신이 하고 있는 일이 매개변수를 배열에 추가하는 것뿐이라면, 간단히 다음과 같이 할 수 있습니다:
array=("$@")
루핑이 필요하지 않습니다.
Bash 매뉴얼로 시작하기특수 매개변수:
(
$*
)는 1부터 시작하는 위치 인수로 확장됩니다. 확장이 큰따옴표 안에 있지 않으면 각 위치 인수가 별도의 단어로 확장됩니다. 이러한 단어는 실행되는 컨텍스트에서 단어 분할 및 경로 이름 확장이 추가로 적용됩니다. 큰따옴표 내에서 확장이 발생하면 IFS 특수 변수의 첫 번째 문자로 구분된 각 인수의 값을 사용하여 단일 단어로 확장됩니다. 즉,"$*"
"$1c$2c..."와 동일합니다. 여기서 c는 IFS 변수 값의 첫 번째 문자입니다. IFS가 설정되지 않은 경우 매개변수는 공백으로 구분됩니다. IFS가 비어 있으면 매개변수를 연결할 때 구분 기호가 삽입되지 않습니다.
(
$@
)는 1부터 시작하는 위치 인수로 확장됩니다. 단어 분할을 수행하는 맥락에서 이는 각 위치 인수를 별도의 단어로 확장합니다. 큰따옴표 안에 있지 않으면 이러한 단어는 단어 분할의 대상이 됩니다. 단어 분할이 수행되지 않는 컨텍스트에서는 각 위치 인수가 공백으로 구분되어 단일 단어로 확장됩니다. 큰따옴표 내에서 확장이 발생하고 단어 분리가 수행되면 각 인수가 별도의 단어로 확장됩니다. 즉,"$@"
“$1” “$2”… 단어 내에서 큰따옴표 확장이 발생하는 경우 첫 번째 인수의 확장은 원래 단어의 시작 부분과 연결되고 마지막 인수의 확장은 원래 단어의 마지막 부분과 연결됩니다. 위치 인수가 없으면"$@"
확장은$@
비어 있습니다(즉, 제거됩니다).
Bash 매뉴얼로 시작하기루프 구조:
'in Words'가 존재하지 않는 경우 for 명령은 'in "$@"'가 지정된 것처럼 설정된 각 위치 인수에 대해 명령을 한 번 실행합니다.
Bash 매뉴얼로 시작하기쉘 매개변수:
쉘 변수 또는 배열 인덱스(배열 참조)에 값을 할당하는 할당 문의 컨텍스트에서 "+=" 연산자를 사용하여 변수의 이전 값에 추가하거나 추가할 수 있습니다.