Bash
目前時間/日期作為 BASH 中的變數並使用腳本停止程序
我正在嘗試創建一個樹莓派間諜凸輪錯誤。我正在努力做到這一點,以便為各種程序創建的新文件提出
NOW=`date '+%F_%H:%M:%S'`;
效果很好。但它需要一個回顯來更新時間
$NOW
也在/home/pi/.bashrc
文件中同樣的問題,不更新wo. ~/.bashrc
我*在這個論壇上*找到了它並且它有效:
#! /bin/bash NOW=`date '+%F_%H:%M:%S'`; filename="/home/pi/gets/$NOW.jpg" raspistill -n -v -t 500 -o $NOW.jpg; echo $filename;
我不明白它是如何工作的,因為它在 raspistil 的輸出和引號之前。
謝謝大家!!!
當你這樣做
NOW=`date '+%F_%H:%M:%S'`
或者,使用更現代的語法,
NOW=$( date '+%F_%H:%M:%S' )
該變數
NOW
將date
在該行執行時設置為命令的輸出。如果您在 中執行此操作~/.bashrc
,那麼$NOW
將是一個時間戳,告訴您何時啟動目前互動式 shell 會話。您還可以設置變數的值
printf -v NOW '%(%F_%H:%M:%S)T' -1
如果您使用的是
bash
4.2 或更高版本。這會將時間戳直接列印到變數中,而無需呼叫date
.在您顯示的腳本中,該變數
NOW
是在腳本執行時設置的(這就是您想要的)。什麼時候分配
filename="/home/pi/gets/$NOW.jpg"
執行後,shell 會展開字元串中的變數。即使它是在雙引號中,它也會這樣做。 單引號會阻止 shell 擴展嵌入式變數(在這種情況下,這不是您想要的)。
請注意,您似乎實際上並沒有
filename
在呼叫中使用該變數raspistill
,所以我不確定您為什麼設置它的值,除非您只是希望它echo
在最後輸出。在其餘的程式碼中,您應該用雙引號將
$NOW
變數擴展 (and$filename
)。如果您不這樣做,並且稍後更改定義方式NOW
以使其包含空格或萬用字元(文件名萬用字元模式),則使用的命令$NOW
可能無法正確解析其命令行。比較,例如,
string="hello * there" printf 'the string is "%s"\n' $string
和
string="hello * there" printf 'the string is "%s"\n' "$string"
相關事項:
- 關於命令替換中的反引號:*sh shell 中的反引號(即
cmd
)是否已被棄用?- 關於引用變數擴展:忘記在 bash/POSIX shell 中引用變數的安全隱患以及為什麼我的 shell 腳本會因空格或其他特殊字元而窒息?