[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.
>