셸 스크립트: 옵션이 포함된 변수 만들기

셸 스크립트: 옵션이 포함된 변수 만들기

다음 매개변수를 사용하는 rsync 명령이 있습니다.

rsync -avz --{partial,stats,delete,exclude=".*"}

해당 매개변수를 변수에 넣어 스크립트에서 재사용할 수 있도록 하고 싶습니다. 이 같은:

#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2

따옴표, 작은 따옴표, 대괄호를 사용해 보았지만 성공하지 못했습니다.

답변1

복잡한 명령을 변수에 넣는 것은 결코 권장되는 접근 방식이 아닙니다. 바라보다BashFAQ/050 - 명령을 변수에 넣으려고 하는데 복잡한 경우에는 항상 실패합니다!

변수 대신 함수를 사용하고 함수에 매개변수를 전달하기로 결정했다면 요구사항은 매우 간단해집니다.

그것은 마치

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --{partial,stats,delete,exclude=".*"} "$@"
}

이제 필수 매개변수를 전달하세요.

rsync_custom /dir1 /dir2

함수 정의는 어떤 면에서는 매우 간단합니다. 먼저 $#0이 되어서는 안 되는 변수를 사용하여 입력 매개변수 개수를 확인합니다. 인수가 제공되지 않았다는 오류 메시지가 표시됩니다. 유효한 인수가 있으면 "$@"함수에 제공된 실제 인수를 나타냅니다.

이것이 자주 사용하는 함수인 경우(예: 스크립트/명령줄에서) 이를 쉘 시작 파일에 추가하세요( .bashrc예: .bash_profile.

또는 언급한 대로 가독성을 높이기 위해 중괄호 확장을 별도의 인수로 확장하는 것이 가치가 있을 수 있습니다.

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --partial --stats --delete --exclude=".*" "$@"
}

답변2

VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

-avz이는 매개변수 등을 사용하여 명령을 실행 --partial하고 환경에 설정하려고 시도합니다.--statsVARrsync

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

중괄호는 따옴표 내에서 확장되지 않고 할당 내부에서도 확장되지 않으며 변수 확장 후에도 확장되지 않기 때문에 인용된 형식은 작동하지 않습니다.

변수에 명령줄 인수를 저장해야 하는 경우 배열을 사용하세요.

args=(rsync -avz --{partial,stats,delete,exclude=".*"})

이제 , 등 을 다른 단어로 "${args[@]}"확장해 보세요 .rsync-avz--partial

배열을 사용하면 필요에 따라 목록에 옵션을 추가할 수도 있습니다. 예를 들면 다음과 같습니다.

args=(this that)
if something ; then
    args+=(another_arg)
fi
"$cmd" "${args[@]}"

또한보십시오:

답변3

최소한 일부 옵션을 변수에 저장할 수 있습니다.

opts=$(echo --{ignore-case,word-regexp,count,exclude="sys*.*"})

차폐가 어려울 수 있으므로 테스트가 중요합니다.

echo $opts
--ignore-case --word-regexp --count --exclude="sys*.*"

grep $opts bytes *.log 

히스토리 사용, 별칭 사용, 함수 사용 등 여러 옵션이 있으므로 명확한 사용 사례가 생각나지 않습니다. 복잡한 옵션은 서로 다른 프로그램 간에 공유되는 경우가 거의 없으므로 대화형 셸에 대한 임시 솔루션의 경우 별칭이 더 나은 접근 방식인 것 같습니다.

alias cgrep='grep --ignore-case --word-regexp --count --exclude="sys*"'
cgrep bytes *.log

귀하의 샘플

VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

작업이 첫 번째 공백에서 끝나기 때문에 작동하지 않습니다. 공백을 가려야 합니다.

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

--delete 옵션으로 테스트하는 것은 매우 위험하지 않습니까? 옵션에 다시 "," 및 작은따옴표가 포함될 수 있으므로 마스킹이 빠르게 어려워집니다. 별칭이나 종속성 기록을 선택하겠습니다.

여러 세션에서 지속적으로 사용할 수 있도록 별칭을 ~/.bashrc 파일에 저장할 수 있습니다. 함수는 bashrc에 저장할 수도 있지만 인수를 처리하려면 함수에 전달하여 거기에서 평가되기만 하면 됩니다.

관련 정보