bash 스크립트에서 $ 1 및 $ 2와 같은 특정 입력 변수를 생략하면서 $ *를 어떻게 사용합니까?


15

예를 들어

elif [[ $append = $1 ]]
then
  touch ~/directory/"$2".txt
  echo "$variable_in_question" >> ~/directory/"$2".txt

모든 입력 팔로 "$2"잉이 포함 된 텍스트 파일을 만들 거나 모든 입력 팔로 잉이있는 기존 텍스트 파일을 추가하려면 4 행 "$2"에서 대신 무엇을 사용해야 "$variable_in_question"합니까?

나는 기본적으로 원 "$*"하지만 생략 "$1"하고 "$2"있습니다.

답변:


32

bash매개 변수 확장 을 사용하여 범위를 지정할 수 있습니다 . 이는 위치 매개 변수에도 적용됩니다. 들어 $3... $n이 될 것이다 :

"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"

모두 알고 있어야 $@하고 $*첫 번째 인수를 무시 $0. 당신이 경우에 사용할 하나 궁금해하는 경우 : 그건 아주 당신이 인용 할 가능성 $@. 인수를 개별적으로 인용 하지 않으려는 $*경우를 제외 하고는 사용 하지 마십시오 .

다음과 같이 사용해 볼 수 있습니다.

$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6

첫 번째 예제 $0에서 첫 번째 인수 0는 스크립트에서 사용될 때 $0두 번째 예제에서 볼 수 있듯이 스크립트 이름으로 채워집니다. 에 스크립트의 이름 bash물론이 있다 가 일반적으로 같은 인식 아니에요 그냥, 첫 번째 인수 - 스크립트를 실행했고 "직접"라는 동일한 간다. 따라서 첫 번째 예에서는 $0= 0, $1= 1등이 있고 두 번째 예에서는 $0= script_file, $1= 0, $2= 1등입니다. ${@:3}로 시작하는 모든 인수를 선택합니다 $3.

가능한 범위에 대한 몇 가지 추가 예 :

 # two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
 # every argument starting with the second to last one
 # a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
 # two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3

더 읽을 거리 :


27

shift내장을 사용할 수 있습니다 :

$ help shift
shift: shift [n]
    Shift positional parameters.

    Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is
    not given, it is assumed to be 1.

    Exit Status:
    Returns success unless N is negative or greater than $#.

전의. 주어진

$ cat argtest.bash 
#!/bin/bash

shift 2

echo "$*"

그때

$ ./argtest.bash foo bar baz bam boo
baz bam boo

3
@Oreoplasm 나는 그것의 가치가 있다고 언급 생각 shift접근은 액세스가 불가능하게됩니다 $1그리고 $2당신이 그들을 이동 후. 스크립트 $2와 함께 사용하는 경우 스크립트 $variable_in_question를 변경하거나 매개 변수 확장 방법을 사용해야합니다.
디저트

6
shift좋은 첫 번째 이상의 인수가 특별하고 (별도의 변수로를 선택하는 것이 합리적 때이다 foo="$1"; bar="$2";, 또는 if [[ something with $1 ]];then blah blah; shift.하지만이 때 비파괴 방식 디저트의 대답 @ 다른 경우에는 좋은 않는 여전히 나중에 전체 목록을 원하는 또는 더 $@많은 요소가없는 경우 명령에 빈 인수를 도입하지 않고 더 멋진 구문을 사용하여 무한 범위가 아닌 제한된 범위의 인수를 선택하는 경우
Peter Cordes

13

일반적으로 위치 매개 변수를 배열에 복사하고 배열의 임의의 인덱스를 삭제 한 다음 배열을 사용하여 원래 인수를 잃지 않고 원하는 인덱스로 정확하게 확장 할 수 있습니다.

예를 들어, 첫 번째, 네 번째 및 다섯 번째를 제외한 모든 인수를 원한다면 :

args=( "$@" )
unset args[0] args[3] args[4]
echo "${args[@]}"

사본에서의 $0일부가 아니므 로 인덱스가 1 씩 이동합니다 $@.


1
물론, 예 echo "${args[@]:2}"를 들어 세 번째에서 마지막 인수에 대해 이를 결합 할 수 있습니다 .
디저트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.