가변 개수의 인수를 허용하는 bash 함수를 만들고 싶습니다. 매개변수가 하나 이상 있어야 합니다. 그런 다음 받아들이는 첫 번째 매개변수와 나머지 매개변수 사이에 고정 값을 삽입해야 하는 다른 프로그램을 호출합니다.
나는 이것을 기반으로이 답변
tt() {
name="$1"
params="${@:2}"
someapp ${name} 1234 /some/path "${params}"
}
그런데 생각보다 안 되더라구요
tt John has fun
결과 호출은 다음과 같습니다.
someapp John 1234 /some/path 'has fun'
따옴표를 참고하십시오. 반면 결과는 다음과 같습니다.
someapp John 1234 /some/path has fun
마지막 두 매개변수는 공개 따옴표로 묶이지 않습니다.
답변1
첫 번째 인수를 선택 shift
하고 저장된 첫 번째 인수와 나머지 인수를 사용하여 다른 명령을 호출합니다.
tt () {
name=$1
shift
someapp "$name" 1234 /some/path "$@"
}
또는 시도하는 것과 같은 명명된 배열을 사용하십시오.
tt () {
name=$1
params=( "${@:2}" )
someapp "$name" 1234 /some/path "${params[@]}"
}
자신의 코드에서 가장 큰 문제점은 변수를 params
배열로 생성하거나 사용하지 않는다는 것입니다. 이를 올바르게 수행하는 것은 큰따옴표와 비트를 포함하여 params=( "${@:2}" )
at as 를 사용하는 것과 같습니다 ."${params[@]}"
[@]
배열 할당은 항상 다음과 같으 name=( ... )
므로 params="${@:2}"
배열이 아니라 처음부터 두 번째 요소로 구성된 단일 문자열이 "$@"
구분 기호로 공백으로 연결됩니다.
에 큰따옴표가 없으면 "${params[@]}"
쉘은 배열의 각 요소를 공백, 탭 및 줄 바꿈( $IFS
기본값은 의 문자)으로 분할한 다음 각 결과 단어에 파일 이름 글로빙을 적용합니다. 그렇지 않은 경우 [@]
배열의 첫 번째 요소만 가져옵니다.
간단한 재작성:
tt () { someapp "$1" 1234 /some/path "${@:2}"; }