
我正在嘗試編寫一個需要用戶互動的腳本。基本上,腳本必須詢問使用者 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 -
答案1
嘗試刪除多餘的'
引號'"$nameoffile"'
例子:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
如果您需要單引號,請像這樣轉義它們:
echo \'$nameoffile\'
'myFile'
答案2
一般來說,需要使用者互動是一個非常糟糕的主意。它使您的腳本無法自動化,並且使您的用戶很難使用,因為他們需要在不允許製表符完成的環境中手動輸入內容。
自從@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 -
答案3
read 支援命名變量,例如;
#!/bin/bash
read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -