확장 변수를 사용하여 명령 구문 분석

확장 변수를 사용하여 명령 구문 분석

무언가를 테스트하려고 시도했지만 무엇을 시도해도 제대로 파악하지 못했기 때문에 제가 바보인지 확실하지 않습니다.

기본적으로 문자열을 ipa-getcert의 저장 후 매개변수로 구문 분석해야 하며, 여기에는 인증서가 갱신된 연도가 포함되어야 합니다. 이는 인증서를 요청하기 위해 스크립트가 한 번 실행된 다음 현재 연도를 사용할 수 있음을 의미합니다(단순). 그러나 ipa-getcert가 인증서를 갱신할 때 post-save 인수와 함께 명령을 실행합니다. 이 경우 갱신 연도를 사용해야 합니다. 발급된 인증서의 전체 문자열을 가져오는 방법(저장 후 옵션 [-C] 포함)은 다음과 같습니다.

sudo ipa-getcert request -N $CERT_CN -K HTTP/$CERT_CN -k /etc/ssl/private/${CERT_CN}.key -f /etc/ssl/certs/${CERT_CN}.crt \
-D $CERT_CN -C "$INST_CERT -n ${CERT_NAME}_"'$(date +"%Y")'" $INST_OPTS $PAN_MGMT"

이를 테스트하기 위해 다음을 시도했지만 날짜가 확장되지 않았습니다. ipa-getcert를 사용하는 것보다 이를 테스트하는 더 좋은 방법이 있습니까?

$ txt="The year is: "
$ echo $txt$(date +"%Y")
The year is: 2023
$ echo $txt'$(date +"%Y")'
The year is: $(date +"%Y")
$ echo $(echo $txt'$(date +"%Y")')
The year is: $(date +"%Y")

그러나 에코된 문자열은 그렇습니다. 따라서 화면에 인쇄되지 않더라도 작은따옴표가 남아 있는 것처럼 보입니다.

$ echo The year is: $(date +"%Y")
The year is: 2023

의심 할 여지없이 여기서 사소한 것이 빠졌습니다.

[편집:] 하지만 다음은 잘 작동하는데, 어쩌면 제가 편집증적인 것일 수도 있나요?

$ mkdir $(date +"%Y")
$ test2="ll "'$(date +"%Y")'
$ echo $test2
ll $(date +"%Y")
$ eval $test2
total 8
drwxrwxr-x  2 user group 4096 Apr 24 20:01 ./
drwxr-xr-x 13 user group 4096 Apr 24 20:01 ../

답변1

쉘은 쉘 구문의 확장된 결과를 구문 분석하지 않습니다. 이는 일반 텍스트 대체가 아닙니다. 이는 따옴표, 기타 확장, 셸 연산자 및 셸 키워드의 경우에도 해당되지만 확장 결과에서는 인식되지 않습니다. 따라서 변수에 달러 기호와 일부 괄호가 포함되어 있으면 달러 기호와 일부 괄호가 표시됩니다.

런타임 시 확장하려면 명령을 함수에 저장하세요.

renew() {
    "$INST_CERT" -n "${CERT_NAME}_$(date +"%Y")" $INST_OPTS "$PAN_MGMT"
}

여기에서 확장하는 변수를 인용할 때는 주의하세요. 토큰화에 의존하는 경우에는 원하는 대로 작동하는지 확인하기 위해 더욱 주의하세요.

관련/참조:변수에 저장된 명령을 어떻게 실행할 수 있나요?

답변2

다음과 같이 따옴표를 제거해야한다고 생각합니다.

RENEW_CMD="$INST_CERT -n ${CERT_NAME}_$(date +%Y) $INST_OPTS $PAN_MGMT"

예:

FILE="example"
FILE2="year"
RND="randomvar"
REZ="$FILE ${FILE2}_$(date +%Y) $RND" 
echo "$REZ"

결과:

example year_2023 randomvar

관련 정보