[英]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.