Shell

如果文件舊於 X 分鐘,如何在 csh FreeBSD 上使用 if

  • October 22, 2019

我有以下程式碼在 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

您在評論中聲明您知道:

  1. 如何安裝 bash。
  2. 不要將預設 shell 更改為 root。
  3. Bash 不會安裝到 /bin 中,因此不能在單使用者模式下直接使用。
  4. 的 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您也可以在本地安裝它。

養成檢查腳本的習慣——這將使您免於許多麻煩。

引用自:https://unix.stackexchange.com/questions/547979