[arrays] Bash에서 명령 행 인수를 배열로 변환

명령 줄 인수를 bash 스크립트 배열로 어떻게 변환합니까?

나는 이것을 가지고 싶다 :

./something.sh arg1 arg2 arg3

그것을로 변환

myArray=( arg1 arg2 arg3 )

스크립트에서 추가로 사용하기 위해 myArray를 사용할 수 있습니다.

이 이전 SO 게시물은 가깝지만 배열을 만드는 방법에 대해서는 다루지 않습니다. Bash에서 명령 줄 인수를 어떻게 구문 분석합니까?

인수를 일반 bash 스크립트 배열로 변환해야합니다. 다른 언어 (예 : Python)를 사용할 수 있지만 bash 에서이 작업을 수행해야한다는 것을 알고 있습니다. “추가”기능 또는 이와 유사한 것을 찾고 있습니까?

업데이트 : 또한 제로 인수를 확인하고 기본 배열 값을 지정하는 방법을 묻고 싶었고 아래 답변 덕분 에이 작업을 수행 할 수있었습니다.

if [ "$#" -eq 0 ]; then
  myArray=( defaultarg1 defaultarg2 )
else
  myArray=( "$@" )
fi



답변

실제로 명령 행 인수는 실제로 는 이미 배열과 같습니다. 최소한 $@변수를 배열처럼 취급 할 수 있습니다 . 즉, 다음과 같이 실제 배열로 변환 할 수 있습니다.

myArray=( "$@" )

인수를 입력하고 $@값에 입력하려면 set다음을 사용하십시오 .

$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit

인수 구조를 사용하는 방법을 이해하는 것은 POSIX sh에서 특히 유용합니다.


답변

아마도 이것이 도움이 될 수 있습니다.

myArray=("$@") 

또한 ‘in’을 생략하여 인수를 반복 할 수 있습니다.

for arg; do
   echo "$arg"
done

동등 할 것이다

for arg in "${myArray[@]}"; do
   echo "$arg"
done


답변

실제로 매개 변수 목록은 $1 $2 ...etc 로 액세스 할 수 있습니다 .
이는 정확히 다음과 같습니다.

${!i}

그래서, 매개 변수의 목록이 세트로 변경 될 수 있습니다,
그리고 ${!i}그들에 액세스 할 수있는 올바른 방법은 다음과 같습니다

$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll

특정 경우, 배열이 필요하지 않은 경우 인수 목록을 설정하기 위해 (배열이 필요없는) 다음을 사용할 수 있습니다.

if [ "$#" -eq 0 ]; then
    set -- defaultarg1 defaultarg2
fi

이것은 더 간단한 표현으로 해석됩니다.

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2


답변

다른 사용법은 다음과 같습니다.

#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=0; i<${arraylength}; i++ ));
do
   echo "${array[$i]}"
done


답변

더 쉽게, 그러나 직접 작업 할 수 있습니다 $@😉

프롬프트에서 직접 args 목록을 전달하는 방법은 다음과 같습니다.

function echoarg { for stuff in "$@" ; do echo $stuff ; done ; } 
    echoarg Hey Ho Lets Go
    Hey
    Ho
    Lets
    Go


답변

배열과 $ @가 실제로 동일한 방식을 나란히 보여줍니다.

암호:

#!/bin/bash

echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: $@"
echo ""

myArray=( "$@" )

echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"

입력:

./bash-array-practice.sh 1 2 3 4

산출:

Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4

A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4


답변

큰 따옴표의 중요성은 강조 할 가치가 있습니다. 인수에 공백이 있다고 가정하십시오.

암호:

#!/bin/bash
printf 'arguments:%s\n' "$@"
declare -a arrayGOOD=( "$@" )
declare -a arrayBAAD=(  $@  )

printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
   echo "${arrayGOOD[$i-1]}"
done

printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
   echo "${arrayBAAD[$i-1]}"
done

산출:

> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and
arguments:the
arguments:mouse.

arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and
the
mouse.

arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
>