itsource

명령줄 인수를 Bash에서 배열로 변환

mycopycode 2023. 4. 17. 21:48
반응형

명령줄 인수를 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 "${@}"; do
   echo "$arg"
done

실제로 파라미터 목록은$1 $2 ...기타.
이는 정확히 다음과 같습니다.

${!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

간단한 조작은 물론,$@;)

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

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

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

코드:

#!/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.
> 

어레이와 $@의 실제 동일성을 나타내는 나란히 표시.

코드:

#!/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

언급URL : https://stackoverflow.com/questions/12711786/convert-command-line-arguments-into-an-array-in-bash

반응형