bash에서 단일 변수에 여러 매개변수를 전달하는 방법은 무엇입니까?

bash에서 단일 변수에 여러 매개변수를 전달하는 방법은 무엇입니까?

두 가지 버전의 Python이 설치되어 있습니다. 따라서 pip를 사용하여 패키지를 다운로드해야 하는 경우 다음 중 하나를 사용해야 합니다.

  1. python3.9 -m pip [args]
  2. python3.8 -m pip [args]

내가 원하는 것은 내가 실행 하면 적절한 명령이 실행 되도록 pip39대신 사용하고 싶다는 것입니다 .pythin3.9 -mpip39 install somethingpip39 freeze

나는 다음 함수를 작성했습니다.

pip39(){python3.9 -m pip "$1"}

매개변수가 하나뿐이므로 pip39 freeze작동 합니다 . freeze그러나 pip39 install something2개의 매개변수가 전달되고 bash는 첫 번째 매개변수만 사용하므로 오류가 발생합니다.

그렇다면 여러 개의 인수를 넣는 방법은 무엇입니까 "$1"?

답변1

Bourne과 같은 셸에서는 "$1"함수의 첫 번째 인수(또는 함수 내부에서 확장되지 않은 경우 스크립트의 첫 번째 인수)로 확장됩니다.빈 문자열그렇지 않은 경우 두 번째, 세 번째... 열 번째가 "$2"되며 제공된 모든 인수로 확장됩니다."$3""${10}""$@"

${1+"$1"}제공된 경우 첫 번째 인수로 확장되고, 그렇지 않은 경우 아무 항목(빈 문자열도 아님)으로 확장됩니다. 따라서 ${1+"$1"} ${2+"$2"}함수의 첫 번째 매개변수는 최대 2개까지 확장됩니다. yash또는 셸 에서는 , , 및 로 zsh단순화할 수 있습니다 "${@[1,2]}"(또는 로 단순화할 수도 "$@[1,2]"있음 zsh) .ksh93bashzsh"${@:1:2}"

pip39() {python3.9 -m pip "$1"}다루기 힘든그런데 문법. bash필요한 다른 Bourne 유사 쉘 pip39() { python3.9 -m pip "$1";}(또는 pip39() python3.9 -m pip "$1"bash, posh 또는 yash는 아니지만 Bourne 쉘 및 대부분의 Bourne 유사 쉘) 에 필요합니다.

따라서 여기 bash(질문에 태그를 지정) 또는 zsh(질문의 코드 구문)에 다음이 필요합니다.

pip39(){ python3.9 -m pip "$@";}

pip39모든 인수를 에 전달하면 python3.9코드는 Bourne 및 POSIX와 호환됩니다.

또는 제한된 수의 매개변수만 전달합니다(여기에서는 3개를 예로 사용합니다).

pip39(){ python3.9 -m pip "${@:1:3}"; } # ksh93, bash, zsh
pip39(){ python3.9 -m pip "${@[1,3]}"; } # zsh, yash
pip39(){ python3.9 -m pip ${1+"$1"} ${2+"$2"} ${3+"$3"}; } # any Bourne-like shell

1 Bourne 쉘이 아닌 경우 9개로 제한됩니다. $10셸 유사 ${10}또는 ${1}0셸 종속(불행히도 POSIX에서는 후자를 요구함)이므로 피해야 합니다.

관련 정보