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

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



답변

예제가 실패하는 이유는 쉘의 단어 분할이 작동하는 방식 때문입니다. 당신이 실행하면 "$($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을 참조하십시오 .


답변

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

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


답변

가장 짧은 대답은

#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'


답변

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

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


답변

아래를 시도하십시오 :

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

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


답변

대신에:

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"


답변

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

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

DATE2=`date +%T`

그때

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