Bash에서 명령줄 매개변수 수정 및 재정렬

Bash에서 명령줄 매개변수 수정 및 재정렬

Bash에서 명령줄 인수를 재정렬하는 방법은 무엇입니까? 이 경우에는 $1첫 번째 인수()를 특정 위치로 이동하고 $1null로 설정 하려고 합니다 .

내 시도는 다음과 같습니다.

#!/bin/bash

FIRST=$1
$1=

echo $* $FIRST 

다음을 제공합니다:

% ./test.sh foo bar quux
./test.sh: line 4: foo=: command not found
foo bar quux foo

다음과 같이 출력되어야 합니다.

bar quux foo

답변1

위치 인수에만 할당할 수 없습니다( 1=value다른 모든 할당과 일치하는 zsh 제외).

첫 번째 인수를 마지막 인수로 이동하려는 경우 사용하기 쉽습니다. shift다음과 같이 출력됩니다 b c a.

set -- a b c
temp=$1
shift
echo "$@" "$temp"

중간으로 이동하는 것은 약간 까다로우며 Bash에서는 "${@:n:m}"삽입 지점 전후의 인수를 가져오는 데 사용할 수 있습니다. 첫 번째 연장이야매개변수는 다음으로 시작합니다.N. 이는 다음을 제공합니다 b c a d e f g(첫 번째 위치를 세 번째 위치로 이동).

set -- a b c d e f g
echo "${@:2:2}" "$temp" "${@:4}"

물론 $1여기에서 Shift를 사용하여 지울 수도 있습니다. 그에 따라 인덱스를 변경하면 됩니다.


빈 문자열 매개변수와 존재하지 않는 매개변수 사이에는 차이가 있습니다. 빈 요소를 유지 "$@"하는 "${@:n:m}"반면 an(따옴표 제외)은 $*모든 인수를 연결한 다음 공백으로 분할합니다. 이렇게 하면 빈 매개변수가 제거되지만 매개변수도 공백으로 분할됩니다. 비교하다:

$ set -- foo '' 'bar bar'
$ printf ":%s\n" "$@"
:foo
:
:bar bar
$ printf ":%s\n" $*
:foo
:bar            
:bar

(따옴표 없는 확장도 파일명 확장이므로 *현재 디렉터리 등의 모든 파일로 확장됩니다.)

관련 정보