여러 매개변수를 단일 문자열로 외부 프로그램에 전달

여러 매개변수를 단일 문자열로 외부 프로그램에 전달

다음과 같이 bash 스크립트에 여러 매개변수를 전달하고 싶습니다.단일 문자열 매개변수외부 실행 파일(특히 git)

다음과 같은 내용을 나타내는 몇 가지 답변을 찾았습니다.

"'$*'"
"'$@'"

전달되면 꽤 좋아 보이지만 echo외부 프로그램에 전달하면 실패합니다. 심지어는 파이프를 통해서도 마찬가지입니다 echo.

이것은 MWE입니다:

#!/bin/bash

# preparation
git init .
git add -A

echo git commit -m "'$@'" # works when copied to terminal
git commit -m "'$@'" # fails if more than one parameter given
git commit -m $(echo "'$@'") # fails if more than one parameter given

rm -rf .git # c

결과 :

$ bash test.sh test2 test2
empty Git-Repository in /tests/bash-scripts/.git/ initialized
git commit -m 'test1 test2'
error: pathspec 'test2'' did not match any file(s) known to git.
error: pathspec 'test2'' did not match any file(s) known to git.

여러 스크립트 매개변수를 다음과 같이 전달하는 방법단일 문자열""(공백 포함)을 외부 실행 파일로 변환합니다( 스크립트 호출로 래핑하지 않음 ).


방금 이것이 작동한다는 것을 알았습니다.

 git commit -m "$(echo "'$@'")"

하지만 이것은 나를 다음 단계로 이끌어줍니다.

-m매개변수가 제공되지 않으면 커밋 메시지 편집기가 트리거되도록 매개변수를 생략하고 싶습니다.

if [ 0 != $# ]
then
  MESSAGE ="-m " "$(echo "'$@'")"
fi
git commit $MESSAGE

또는

if [ 0 != $# ]
then
  MESSAGE =("-m " "$(echo "'$@'")")
fi
echo 
git commit ${MESSAGE[@]}

wose가 다시 실패하더라도 인용된 단어는 분리됩니다.

$bash test.sh "test1 test2" test3
git commit -m 'test1 test2 test3'
error: pathspec 'test2' did not match any file(s) known to git.
error: pathspec 'test3'' did not match any file(s) known to git.

답변1

모든 인수를 문자열로 해석하려면 다음을 사용하십시오.

"$*"

git commit -m "$*"

man bash"특수 매개변수" 아래에 문서화되어 있습니다 .

*1부터 시작하는 위치 매개변수로 확장됩니다. 확장이 큰따옴표 안에 있지 않으면 각 위치 인수가 별도의 단어로 확장됩니다. 이러한 단어는 실행되는 컨텍스트에서 단어 분할 및 경로 이름 확장이 추가로 적용됩니다. 큰따옴표 내에서 확장이 발생하면 단일 단어로 확장되며 각 인수의 값은 IFS특수 변수의 첫 번째 문자로 구분됩니다. 즉, IFS 변수 값의 첫 번째 문자가 어디에 있는지 "$*"와 같습니다 . 설정하지 않으면 매개변수가 공백으로 구분됩니다. null 인 경우 매개변수는 구분 기호를 삽입하지 않고 연결됩니다."$1c$2c..."cIFSIFS

관련 정보