스크립트에서 공백을 변수로 사용하여 날짜 출력 형식을 지정하는 방법은 무엇입니까?

스크립트에서 공백을 변수로 사용하여 날짜 출력 형식을 지정하는 방법은 무엇입니까?

date명령을 다음과 같은 형식으로 만들고 싶습니다 .

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

하지만 다음과 같은 스크립트에서 호출할 수 있도록 변수에 저장하고 싶습니다. echo "$(nice_date) [WARNING] etc etc"

그러나 그것은 작동하지 않습니다

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S’
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

date 명령이 올바른 매개변수를 얻도록 이를 수행하는 올바른 방법은 무엇입니까?

답변1

예제가 실패한 이유는 쉘의 단어 분리가 작동하는 방식 때문입니다. 을 실행하면 "$($nice_date)"셸은 date두 개의 인수 "+%Y-%m-%d"와 를 사용하여 명령을 실행합니다 "%H:%M:%S". 날짜의 형식 문자열은 단일 인수여야 하기 때문에 실패합니다.

이를 수행하는 가장 좋은 방법은 명령을 변수에 저장하는 대신 함수를 사용하는 것입니다.

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$@"
}
format_date
format_date -d "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

실제로 명령을 변수에 저장하려면 배열을 사용할 수 있습니다.

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" -d "2015-09-17 16:51:58"

변수에 명령을 저장하는 과정의 복잡성에 대한 자세한 내용은 다음을 참조하세요.배쉬 FAQ 050.

답변2

간단한 방법은 \를 사용하여 공간을 "탈출"하는 것입니다.

nice_date="date +%Y-%m-%d\ %H:%M:%S"

답변3

나는 기능이 가장 좋은 방법이라는 데 동의합니다. 대안으로 전체 명령 대신 형식을 변수로 저장하십시오.

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

답변4

바꾸다:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

노력하다:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

또한 마지막 명령 대체가 필요하지 않습니다.

date "$nice_date_format"

관련 정보