我正在為一個專案製作一個模板 shell 腳本,其中一個必須的功能是能夠將模板設定檔複製為新檔案。但是,這不會靜態處理,我會建立並設定一個運行時變數( $modloader
)來自 shell 腳本檔名並將模板複製為同名。我用靜態文件名做了一些測試並且cp
工作正常,但在檢查文件是否已經存在時似乎崩潰了(5號線)。如果我在終端機中運行它,它不會看到它正在檢查的檔案。我相信它是在更字面的背景下尋找它,而不是'理解'它使用一個變數。
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
答案1
檢查文件是否已經存在時似乎崩潰了
我沒有看到您正在檢查文件是否已經存在。你的if "./Settings/$modloader.ini";
嘗試跑步ini 檔。一般來說,如果文件被設計為像這樣運行並根據您想要測試的內容返回退出狀態,那麼它可能是對某些東西的有效測試。
即使可以運行有問題的文件,讓該文件作為其自身(不)存在的測試器也是沒有意義的。
在 shell 中判斷檔案是否存在的正確方法是:
test -e "./Settings/$modloader.ini"
# or equivalently
[ -e "./Settings/$modloader.ini" ]
筆記:
test -e
測試一個文件任何類型。test -e
Settings
如果某些相關目錄的權限(例如在您的情況下)不允許檢查檔案是否存在,那麼會給您一個誤報(即非零退出狀態) 。
此外,您還想否定測試。您的程式碼中的行將類似於:
if ! [ -e "./Settings/$modloader.ini" ]; then
if
但沒有必要。cp
帶有-n
( ) 的GNU--no-clobber
可能可以代替if … fi
您的這個。此選項不可移植,您很可能需要另一個不可移植選項-T
( --no-target-directory
),以防目標是目錄(的符號連結)。
cp -nT "./Settings/Template.ini" "./Settings/$modloader.ini"
請注意,如果目標已經存在並且因此cp -n
是無操作,則退出狀態將為0
。如果目標不存在且複製成功,您將獲得相同的退出狀態。這意味著如果您想要cp
根據文件是否存在執行更多操作,則if
無論如何您都需要事先執行。