簡體   English   中英

Bash - 日期命令和空格

[英]Bash - Date command and space

我正在嘗試創建一個在 bash 中使用 date 命令的腳本。 我熟悉 date 命令的基本語法。 這是簡單的腳本:

#!/bin/bash 
set -x 
DATE_COMMAND="date "+%y-%m-%d %H:%M:%S"" 
echo "$($DATE_COMMAND)" 
set +x

問題是上面的代碼不起作用。 這是輸出:

+ DATE_COMMAND='date +%y-%m-%d'
+ %H:%M:%S
onlyDate: line 3: fg: no job control
+ echo ''

+ set +x

好的,所以問題是 bash 因為空間而拆分了命令。 我可以理解,但我不知道如何避免這種情況。 我試圖避免使用\\的空格,以避免空格和" 。單引號似乎也不起作用。

請注意,我知道這個腳本可以這樣寫:

#!/bin/bash
set -x
DATE_COMMAND=$(date "+%y-%m-%d %H:%M:%S")

echo "$DATE_COMMAND"
set +x

我已經嘗試過了,但我不能使用這種方法,因為我想在我的腳本中多次運行該命令。

任何幫助將不勝感激!

正確的方法是在 Bash 腳本中定義自己的函數。

function my_date {
  date "+%y-%m-%d %H:%M:%S"
}

現在您可以像使用外部程序一樣使用my_date

例如:

echo "It is now $(my_date)."

或者干脆:

my_date

為什么你的方法不起作用?

第一個問題是你的任務被破壞了。

DATE_COMMAND="date "+%y-%m-%d %H:%M:%S""

這被解析為將字符串date +%y-%m-%d分配給變量DATE_COMMAND 在空白之后,shell 開始以您不希望的方式解釋剩余的符號。

這可以通過更改報價部分修復。

DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"

然而,這並不能真正解決問題,因為如果我們現在使用

echo $($DATE_COMMAND)

它不會正確擴展參數。 date程序將看到參數'+%y-%m-%d%H:%M:%S' (帶引號)而不是單個字符串。 這可以通過使用eval來解決

DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
echo $(eval $DATE_COMMAND)

其中變量DATE_COMMAND首先擴展為字符串date '+%y-%m-%d %H:%M:%S'然后對其進行eval ,就好像它是這樣寫的,從而正確調用date

請注意,我展示這個只是為了解釋這個問題。 eval在這里不是一個好的解決方案。 改用函數。

PS 最好避免全大寫的標識符字符串,因為它們經常與環境變量沖突,甚至對 shell 具有神奇的意義。

逃離空間對我有用。

echo `date +%d.%m.%Y\ %R.%S.%3N` 

最短的答案是

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

#or direct output
date '+%F" "%T'

對於長腳本

聲明變量部分:

dateformat="%Y-%m-%d %H:%M:%S"

任何地方獲取日期:

datestr=`date +"${dateformat}"`

任何地方回顯日期:

echo ${datestr}

對於簡短的簡單腳本,DaniëlGu 的回答是最好的:

echo `date +%d.%m.%Y\ %R.%S.%3N`

我正在使用:

DF="+%m/%d/%Y %H:%M:%S";
FILE_DATE=$(date "${DF[@]}" -r "${SCHEMA_LOCAL_PATH}.gz");

似乎 Bash 將 $DF 中的空間視為數組的分隔符,並且“日期”接收 2 個 agruments 而不是一個,所以我發送一個數組。

也適用於我(檢查“+”號):

DF="%m/%d/%Y %H:%M:%S";
FILE_DATE=$(date +"${DF}" -r "${SCHEMA_LOCAL_PATH}.gz");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM