[ "@$1@" = "@@" ]; 경우에는 어떻게 되나요? 배쉬에서 그것은 무엇을 의미합니까?

[ "@$1@" = "@@" ]; 경우에는 어떻게 되나요? 배쉬에서 그것은 무엇을 의미합니까?

저는 스크립팅을 처음 접했고 그것이 무엇을 하는지 알아내려고 노력하고 있습니다. 도울 수 있니?

if [ "@$1@" = "@@" ]; then
strDate ='date +%Y%m%d' 
else
strDate=$1
fi

답변1

전체적인 구조는if {조건} then {뭔가를 하세요} else {뭔가 다른 일을 하세요}. 셸 자체에는 fi구문의 끝을 알리고 [ ... ]조건부 테스트를 수행하는 등 구문을 구문 분석하는 데 도움이 되는 더 많은 구문이 필요합니다. )

  • 조건부 테스트는 [ "@$1@" = "@@" ]두 문자열이 동일한지 비교합니다( [ X = Y ]).

    • 첫 번째 문자열 @뒤에는 프로그램이나 함수의 첫 번째 매개변수( $1)가 오고 그 다음에는 또 다른 @. 따라서 첫 번째 매개변수로 전달하면 red문자열은 가 됩니다 @red@. 반면에 아무것도 전달하지 않으면 문자열은 다음과 같습니다.@@
    • 두 번째 문자열은 리터럴입니다.@@

    여기서 일어나는 일은 조건부 테스트가 $1(프로그램이나 함수의) 첫 번째 인수가 null인지 확인하는 것입니다. 로 쓰는 것이 가장 좋습니다 [ -z "$1" ].

  • 다음 줄에 strDate ='date +%Y%m%d'구문 오류가 있어서 실행할 수 없습니다. 어쩌면 을 의미하는 것일 수도 있습니다 . strDate=`date +%Y%m%d`이제 를 쓰는 것이 더 좋습니다 strDate=$(date +%Y%m%d). (두 경우 모두 변수 이름과 해당 할당 사이에 공백이 있어서는 안 됩니다 =. 표시된 작은따옴표( '...')는 할당이 문자열에서 12자라는 의미입니다 date +%Y%m%d. 그러나 목적은 다음과 같습니다 . 백틱을 명시적으로 사용하여 명령 실행의 출력을 할당하는 것입니다.) 이 줄은 $strDate변수를 오늘 날짜 형식으로 할당 합니다 YYYYMMDD(예: 2022년 8월 12일은 20220812).

  • 최종 할당은 프로그램이나 함수의 첫 번째 인수로 제공된 값을 변수에 할당합니다 strDate=$1. $strDate귀하가 제공한 코드의 값에 대한 추가 검증은 없습니다.

코드를 전달하면 많은 구문 및 구성 오류를 식별할 수 있다는 점을 지적하고 싶습니다 shellcheck(또한https://shellcheck.net/).

다음은 더 나은 가독성을 위해 들여쓰기가 포함된 수정된 코드입니다.

if [ -z "$1" ]
then
    strDate=$(date +'%Y%m%d')
else
    strDate=$1
fi

쉘의 구문이 첫 번째 단락에서 제공한 설명을 명확하게 구현한다는 것을 알 수 있습니다. 어떤 사람들은 then원래 코드에서 했던 것처럼 같은 줄에 넣기를 좋아합니다. 일관성을 유지하는 한 어느 쪽이든 문제가 되지 않습니다. 그러나 숙련된 거의 모든 코더는 코드 구조를 표시하기 위해 들여쓰기를 사용하며, 이는 범주 전반에 걸쳐 오류를 줄이는 데 도움이 되므로 자신의 코드에서 사용할 가치가 있는 방법입니다.ifif [ -z "$1" ]; then

마지막으로 단일 조건부 할당을 사용하여 전체 블록을 보다 관용적인 방식으로 대체할 수 있습니다.

strDate=${1:-$(date +'%Y%m%d')}

관련 정보