如果文件舊於 X 分鐘,如何在 csh FreeBSD 上使用 if
我有以下程式碼在 Debian 系統中工作:
for File in "${Files[@]}"; do if test "`find $FolderDownload/$File -cmin -190`" ; then echo "File is new then 3 hours" # Set concatenation FileConcat=1 # Get out ot next step break else echo "There's no change in the $File in past 6 hours" fi done
如何在預設 csh 上的 FreeBSD 系統上使用它?
其實我正在嘗試:
foreach File ($Files) if (test find $FolderDownload/$File -cmin -190) then echo "File is new then 3 hours" # Set concatenation FileConcat=1 # Get out ot next step break else echo "There's no change in the $File in past 6 hours" endif end
但它返回錯誤:
if: Expression Syntax.
變數的內容類似於:
文件 = {“File1.txt”,“File2.txt”,“File3.txt”,“File4.txt”}
FolderDownload = “/var/scripts/”
文件連接 = 0
您在評論中聲明您知道:
- 如何安裝 bash。
- 不要將預設 shell 更改為 root。
- Bash 不會安裝到 /bin 中,因此不能在單使用者模式下直接使用。
- 的 toor 使用者。
以上都是正確的,對你有好處!
一個不重要的小誤解。為此目的創建了 toor 使用者。它具有 uid 0(與 root 一樣),因此您可以為toor設置任何您喜歡的 shell 。
一個更大的誤解是大多數 FreeBSD 腳本都是用 (t)csh 編寫的。他們不是!系統腳本是用 sh 編寫的。看看
/bin/freebsd-version
或/usr/bin/zdiff
Bash 不是 FreeBSD 作業系統的一部分。但是,如果您安裝和使用它,系統不會變得不純。您甚至不必更改使用者 shell。但如果你這樣做了——只要保持你的根。
然而,手頭還有更大的問題。
不要用csh寫腳本!!!
即使預設的 root shell 是 (t)csh,您也不應該在任何系統上編寫 csh 腳本。這是相當普遍的共識,如果您需要完整的故事,請閱讀CSH 程式被認為是有害的
社邦
每當您編寫腳本時,您都應該以“shebang”開始第一行(請參閱Bash Shebang中的更多內容)。這告訴系統在執行腳本時使用哪個解釋器。您可以毫無問題地從 csh 執行 bash(或 perl/zsh/etc)腳本。
為了獲得最佳便攜性,請使用:
#!/usr/bin/env bash
這將通過 $PATH 查找您的 bash 位置。對我來說這是最好的解決方案。
其他人則主張您永遠不應該這樣做,而是指定確切的位置。然後,這將要求添加到目標系統。要麼更新 shebang shen 移動腳本,要麼確保目標系統在 /bin 中有指向 bash 的連結。
使用 sh 實現廣泛的可移植性
如果您想要更好的可移植性,請使用 sh shell 編寫腳本。它的功能比 bash 少,但您可以確定它在所有 POSIX(-like) 系統上都可用。
Shell腳本很難!
編寫正確的 shell 腳本可能非常困難。幫助您的第一個也是最好的工具是Shellcheck。您也可以在本地安裝它。
養成檢查腳本的習慣——這將使您免於許多麻煩。