아래 예제 스크립트에서는 스크립트를 사용하는 프로세스에 따라 하나 또는 두 개의 이메일 주소로 보내는 데 사용됩니다. 추가 이메일 주소를 구입하려면 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
. 그들은 다르다:
껍데기:
set -- foo bar baz buzz zap bang ; echo $2
두 번째 단어만 출력합니다.
bar
read
두 개의 변수 이름을 사용하는 명령:echo foo bar baz buzz zap bang | (read x y ; echo $y )
두 번째 단어를 포함한 모든 것을 출력합니다.
bar baz buzz zap bang