Files
在 unix 中寫入文件
我在用 unix 寫入文件時遇到了一些問題
[ -s $PWD/MEN/*sub.wav ] && echo "File there" || echo "File Not there" > temp.csv
我正在嘗試這個 unix 命令,但它沒有寫入文件 temp.csv。
如果你破壞你的命令,那麼這些是等價的
[ -s $PWD/MEN/*sub.wav ]
如果您的模式 “$PWD”/MEN/*sub.wav 不匹配多個文件名,它將無論如何都會執行。然後來了
echo "File There"
外殼嘗試執行此命令,在您的情況下,它已成功執行然後來
||
這意味著如果左側部分失敗,則執行右側部分。由於我們的左側部分被執行,那麼右側部分將永遠不會被執行。如果你想在那裡寫文件到 temp.csv 那麼你的命令看起來像[ -s $PWD/MEN/*sub.wav ] && echo "File there" > temp.csv || echo "File Not there" > temp.csv
或者如果你想同時寫這兩個部分
[ -s $PWD/MEN/*sub.wav ] && echo "File there" > temp.csv && echo "File Not there" > temp.csv
在您的命令中寫入的唯一內容
temp.csv
是 lastecho
,只有在-s
測試或第一個echo
失敗時才會執行。要正確輸出到文件
if [ -s MEN/*sub.wav ]; then echo "File there"; else echo "File not there"; fi >temp.csv
或(不完全等價),
[ -s MEN/*sub.wav ] && echo "File there" >temp.csv || echo "File not there" >temp.csv
另請注意,如果您的模式
MEN/*sub.wav
匹配多個文件名,這將在您的程序中生成語法錯誤。您想測試是否至少有一個名稱與模式匹配,並且是非空的(
-s
測試),然後使用set -- MEN/*sub.wav # Loop over the matching names (if any). # Stop when we find a non-empty file. while [ "$#" -gt 0 ] && [ ! -s "$1" ]; do shift done if [ -s "$1" ]; then echo File exists else echo File not there fi >temp.csv
您是否要測試與模式匹配的所有名稱是否都是非空的:
set -- MEN/*sub.wav # Loop over the matching names (if any). # Stop when we find an empty file. while [ "$#" -gt 0 ] && [ -s "$1" ]; do shift done if [ "$#" -eq 0 ]; then echo File(s) exists else echo File(s) not there fi >temp.csv
最後一段程式碼依賴於 shell 保留未擴展的模式,以防沒有匹配的名稱。