스크립트에서 공백으로 날짜 출력을 변수로 포맷하는 방법은 무엇입니까?


13

다음 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 명령이 올바른 인수를 얻도록 올바른 방법은 무엇입니까?


참고로 "%F %T"GNU를 사용 하는 경우 날짜 형식 문자열을 줄일 수 있습니다 date.
jordanm

문제는 공간입니다. 를 사용 nice_date="date +%Y-%m-%d-%H:%M:%S"하면 작동합니다. 현재 두 번째 쉘에서 해당 공간을 보호하는 방법을 알 수 없습니다.
MadHatter

답변:


13

예제가 실패하는 이유는 쉘의 단어 분할이 작동하는 방식 때문입니다. 당신이 실행하면 "$($nice_date)", 쉘은 실행되는 date두 개의 인수 명령을 "+%Y-%m-%d"하고 "%H:%M:%S". date의 형식 문자열이 단일 인수 여야하므로 실패합니다.

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

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "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[@]}" "2015-09-17 16:51:58"

변수에 명령을 저장하는 복잡한 경우에 대한 자세한 내용은 BashFAQ 050을 참조하십시오 .


고맙지 만 내 접근 방식이 왜 효과가 없는지 궁금합니다. 자세히 설명해 주시겠습니까?
gilbertasm

@gilbertasm 답변 업데이트 됨
jordanm

1
date: extra operand ‘’위의 두 가지 접근 방식 에서 오류 가 발생했습니다
Jeff Puckett

3

기능이 최선의 방법이라는 데 동의합니다. 대안으로 간단히 형식을 전체 명령이 아닌 변수로 저장하십시오.

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

1
@ Kusalananda : 그렇습니다. 감사합니다! 답을 업데이트 함
Adam

그리고, 미안하지만 echo명령 대체는 불필요합니다.
Kusalananda

1
예, 그들은 내가 사용한 컷 다운 예제에서 기술적으로 불필요했습니다 (더 읽기 쉬운 코드를 생성 할 수는 있지만 맛의 문제입니다). OP의 예제를 사용하도록 업데이트되었습니다.이 경우 필요합니다
Adam

예, 그 예가 더 합리적입니다.
Kusalananda

1

가장 짧은 대답은

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

한 가지 쉬운 방법은 \로 공간을 '탈출'하는 것입니다.

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

0

아래를 시도하십시오 :

키보드의 물결표 키에있는 기호 "`"를 추가해야합니다. 이 기호는 쉘이 명령을 먼저 실행 한 다음 변수에 할당하도록 지시합니다.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

Iain의 답변과 같은 문제.
MadHatter

0

대신에:

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"

-1

같은 문제가 있었다; splunk로 처리하기 위해 awk 인쇄에 날짜를 넣어야했습니다. 나는 사용했다

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

그때

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
이것이 어떻게 질문에 대답하는지 정확하게 설명 할 수 있습니까?
G-남자 '는 분석 재개 모니카'말한다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.