Bash에서 명령 줄 인수를 변경하는 방법은 무엇입니까?


94

Bash 스크립트에서 명령 줄 인수를 변경하는 방법이 있습니까? 예를 들어 Bash 스크립트가 다음과 같은 방식으로 호출됩니다.

./foo arg1 arg2  

스크립트 내에서 arg1의 값을 변경하는 방법이 있습니까? 다음과 같이 말하십시오.

$1="chintz"

답변:


150

모든 인수를 재설정해야합니다. 예를 들어 변경하려면 $3:

$ set -- "${@:1:2}" "new" "${@:4}"

기본적으로 변경하려는 인수를 제외한 모든 인수를 현재 값 으로 설정 합니다 . POSIX 7set -- 에서도 지정 됩니다 .

"${@:1:2}"표기법 (따라서 두 가지로 확장 2표기에서)에서 시작 위치 인수 오프셋 1(즉, $1). "$1" "$2"이 경우에 대한 속기 이지만 예를 들어 대체하려는 경우 훨씬 더 유용합니다 "${17}".


1
그래서 $ 3를 바꾸려면 $ 1과 $ 2도 바꿔야 하죠? 그리고 그것들을 무엇으로 바꾸나요? "재설정"은 무엇을 의미합니까?
Sriram

트릭 주셔서 감사합니다! 공백이 포함 된 파일 이름에 이것을 사용하는 데 어려움이있었습니다. 그 문제에 부딪 힐 수있는 다른 사람을 위해 이것eval 에 따라 줄의 맨 앞에 두십시오 .
cxw

2
변경하려는 매개 변수의 위치를 ​​알고 있으면 괜찮습니다. 실제로 그것을 모르고 동적으로 변경해야하는 경우 어떻게해야합니까? $ set- "$ {: 1 : $ pivot}"로 시도했지만 거기에서 변수를 허용하지 않습니다.
Daniele Segato 2014 년

1
함수 내에서 같은 일을 어떻게 할 수 있습니까? 함수 내부에서 호출 될 때 솔루션이 작동하지 않는 것 같습니다.
Hashken

2
함수 내에서 스크립트의 위치 매개 변수를 변경할 수 없습니다. 함수의 자체 인수가이를 숨 깁니다. 그러나 배열에 저장하고 작업 할 수 있습니다.
thkala

23

가독성 및 유지 보수에 대한 최적화, 당신은 할당 나을 수 $1$2(나도 몰라,보다 의미있는 변수 input_filename = $1output_filename = $2또는 무언가)를 그 변수 중 하나를 (덮어 쓰기 input_filename = 'chintz'가 인 경우) 변경 스크립트에 입력을 떠나 다른 곳에 필요합니다.


입력 인수 중 하나를 변경할 수있는 접근 방식을 원했습니다. 스크립트에서 값을 반환하고 싶었 기 때문에 그렇게해야했습니다. thkala가 제안한 대답은 잘 작동했습니다. 응답 해 주셔서 감사합니다 !!!
Sriram

3
@Johnsyweb 동의합니다. 가독성을 위해 귀하의 방법이 더 나은 방법입니다.
Dss

1
"You are better off"는 항상 제공되지 않는 사용 사례에 따라 다릅니다.
스콧

2
@Scott은 내가이 답변을 썼을 때보 다 7 세 더 많고 경험이 많으므로 동의하는 경향이 있습니다.
Johnsyweb

이것이 작동하지 않는 예 ($ FIRST_PARAMETER와 같은 것을 사용하는 것 제외) : 실제 값에 따라 매개 변수의 용도와 의미를 가짐.
Igor Stoppa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.