Bash 쉘 스크립트에서 $2가 명령줄의 여러 인수와 같을 수 있습니까? 아니면 3달러, 4달러 등의 비용이 드나요?

Bash 쉘 스크립트에서 $2가 명령줄의 여러 인수와 같을 수 있습니까? 아니면 3달러, 4달러 등의 비용이 드나요?

아래 예제 스크립트에서는 스크립트를 사용하는 프로세스에 따라 하나 또는 두 개의 이메일 주소로 보내는 데 사용됩니다. 추가 이메일 주소를 구입하려면 3달러를 추가해야 합니까, 아니면 2달러면 충분합니까?

(
for file in /usr/app/tst/$1/MS_CASE_ST*.csv;
do
   uuencode ${file} $(basename ${file})
done
) | mailx -s "MS_CASE_ST*.csv file contains data. Please Research" $2 

example.sh 스크립트가 실행되는 방법의 예:

$ ./example.sh output [email protected] [email protected]

답변1

$2항상 두 번째 인수만 사용됩니다. $@는 모든 매개변수의 배열이므로 두 번째 매개변수를 끝까지 원할 경우 다음과 같이 할 수 있습니다.

... | mailx -s "MS_CASE_ST*.csv file contains data.  Please research" "${@:2}"

오프셋 :2을 지정합니다매개변수 확장$@배열을 확장할 때

답변2

이 특정 스크립트를 사용하여 여러 수신자를 지원하려면 $1경로 요소로 사용한 다음 위치 매개변수 목록 밖으로 이동하세요. 이제 목록 $@에는 수신자만 포함됩니다.

#!/bin/bash

dir=$1
shift

shopt -s nullglob

for file in "/usr/app/tst/$dir/MS_CASE_ST"*.csv; do
    uuencode "$file" "$( basename "$file" )"  # or uuencode "$file" "${file##*/}"
done | mailx -s 'MS_CASE_ST*.csv file(s) contains data. Please Research' "$@"

몇 가지 참고사항:

  • 주의하고 변수 확장을 큰따옴표로 묶으십시오. 그렇지 않으면 경로 이름에 공백이나 파일 이름 와일드카드 문자 등(작은따옴표로 묶인 정적 문자열 포함)이 포함된 경우 문제가 발생합니다.

  • $@다음 으로 인용하면 "$@"개별적으로 인용된 요소까지 확장됩니다.

  • nullglob셸 옵션을 설정 하면 bash루프에서 사용하는 와일드카드 패턴이 다음으로 확장됩니다.아무것도 없다기존 경로 이름과 일치하지 않는 경우.

답변3

이 문제는 혼란스러워 보입니다.껍데기명령의 매개변수입니다 read. 그들은 다르다:

  1. 껍데기:

    set -- foo bar baz buzz zap bang ; echo $2
    

    두 번째 단어만 출력합니다.

    bar
    
  2. read두 개의 변수 이름을 사용하는 명령:

    echo foo bar baz buzz zap bang | (read x y ; echo $y )
    

    두 번째 단어를 포함한 모든 것을 출력합니다.

    bar baz buzz zap bang
    

관련 정보