Bash

腳本中的命令 find 和 tar

  • October 24, 2016

我正在嘗試編寫一個需要使用者互動的腳本。基本上,腳本必須向使用者詢問 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'

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