Bash
腳本中的命令 find 和 tar
我正在嘗試編寫一個需要使用者互動的腳本。基本上,腳本必須向使用者詢問 3 個參數:使用者想要查找的文件的名稱、修改文件的天數以及 tar 存檔的名稱。當所有參數都已知時,腳本必須找到適當的文件並將它們製作成具有給定名稱的存檔。當我將單個命令寫入終端時:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
它運作良好。如何使用使用者輸入的變數來呼叫同一腳本中的命令?我的腳本正在製作一個空存檔。
我的腳本:
echo "Enter a number of days" read days echo "Enter the name of file" read nameoffile echo "Enter the name of tar archive" read nameofarchive find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -
一般來說,需要使用者互動是一個非常糟糕的主意。它使您的腳本無法自動化,並且使您的使用者很難使用,因為他們需要在不允許選項卡完成的環境中手動輸入內容。
由於@maulinglawns已經解釋了您的腳本失敗的原因,我將為您提供一種更簡單的方法,不需要您的使用者費力地輸入資訊:
#!/usr/bin/env sh days="$1" nameoffile="$2" nameofarchive="$3" find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
然後,要查找
foo.txt
最近 3 天內修改的名為 的文件並將它們歸檔到 bar.tar.gz`,您將執行:script.sh 3 foo.txt bar
您還可以添加一些簡單的錯誤檢查,以確保腳本始終使用正確數量的參數執行:
#!/usr/bin/env sh if [ $# -ne 3 ]; then echo "You need to enter three arguments" exit 1 fi days="$1" nameoffile="$2" nameofarchive="$3" find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
嘗試刪除多餘的
'
引號'"$nameoffile"'
例子:
maulinglawns@debian-HP:~$ read nameoffile myFile maulinglawns@debian-HP:~$ echo '"$nameoffile"' "$nameoffile" maulinglawns@debian-HP:~$ echo "$nameoffile" myFile
如果您需要單引號,請像這樣轉義它們:
echo \'$nameoffile\' 'myFile'