[英]Veeam CLI Unknown Argument when Passing Arguments in Bash Script
我正在編寫一個 bash 腳本來調用 Veeam Backup CLI 的功能。
在這個腳本中,我有一個 function 來配置一個新的備份作業。
function configureBackupJob() {
jobname="$1"
reponame="$2"
objects="$3"
advancedOptions="$4"
scheduleOptions="$5"
activeFullBackupOptions="$6"
indexingOptions="$7"
command="veeamconfig job create filelevel --name ${jobname} --reponame ${reponame} --includedirs ${objects} ${advancedOptions} ${scheduleOptions} ${activeFullBackupOptions} ${indexingOptions} --nosnap"
echo "${command}"
veeamconfig job create filelevel --name "$jobname" --reponame "$reponame" --includedirs "$objects" "$advancedOptions" "$scheduleOptions" "$activeFullBackupOptions" "$indexingOptions" --nosnap
}
在調用腳本時,我使用一個案例來確定應該調用哪個 function:
case $command in
# More cases before and after this one
configureBackupJob)
configureBackupJob "$2" "$3" "$4" "$5" "$6" "$7" "$8"
;;
*)
showHelp
;;
esac
我這樣調用腳本:
sudo ./script.sh configureBackupJob "TheJobsName" "RepositoryName" "/path/FoldertoBeBackedUpByVeeam" "--daily --at 12:15" "--weekdays-full Monday,Wednesday" "--indexall"
我使用 Veeam 幫助中心的這個網站了解 arguments: Veeam 幫助中心:創建文件級備份作業
調用腳本會導致錯誤消息
Unknown argument: [--daily --at 12:15].
如果我手動調用 veeamconfig,我的 echo 顯示的命令可以正常工作。
為什么我可以直接調用命令而不是從腳本中調用? 我嘗試在沒有雙引號的情況下調用 function 但這不起作用。
我不能像這樣對所有 arguments 進行硬編碼
--includedirs
所以我需要找到一種方法來傳遞 arguments 就像
--daily --at 12:15
基本問題是您將“ --daily --at 12:15
”作為單個參數傳遞給veeamconfig
命令,而不是三個單獨的--at
(“ --daily
”、“--at”和“ 12:15
")。 這veeamconfig
感到困惑。 當你echo
顯它時它看起來沒問題,因為這失去了 arguments 和 arguments之間的空格之間的區別。
處理此問題的最佳方法取決於幾件事:首先,您的腳本是否關心哪些選項與調度、索引、完整備份和其他任何事情有關,或者如果只有一個選項列表可以提供給veeamconfig
命令? 其次,路徑/選項/任何內容是否可能包含空格(或文件名通配符) ,以及它們之間? (注意:我主要使用 macOS,其中帶有空格的路徑非常常見。)
如果腳本不必區分不同類型的選項,這很簡單:只需將所有選項作為單獨的 arguments 一直傳遞,並在必要時將它們存儲為數組而不是單獨的字符串(並使用bash printf
的%q
選項以正確引用/轉義打印命令選項):
function configureBackupJob() {
jobname="$1"
reponame="$2"
object="$3"
allOptions=("${@:4}") # This stores all arguments starting with $4 in an array
printf -v command '%q ' veeamconfig job create filelevel --name "$jobname" --reponame "$reponame" --includedirs "$object" "${allOptions[@]}" --nosnap
echo "${command}"
veeamconfig job create filelevel --name "$jobname" --reponame "$reponame" --includedirs "$object" "${allOptions[@]}" --nosnap
}
並這樣稱呼它:
case $command in
# More cases before and after this one
configureBackupJob)
configureBackupJob "${@:2}"
...
並像這樣運行整個腳本:
sudo ./script.sh configureBackupJob "TheJobsName" "RepositoryName" "/path/FoldertoBeBackedUpByVeeam" --daily --at 12:15 --weekdays-full Monday,Wednesday --indexall
如果腳本需要區分不同類型的選項,事情就會變得更加混亂。 如果選項中不可能有空格或類似通配符的字符,則可以在將這些變量傳遞給veeamconfig
命令時不加引號,並讓 shell 的分詞將它們分解為單獨的 arguments:
veeamconfig job create filelevel --name "$jobname" --reponame "$reponame" --includedirs "$objects" $advancedOptions $scheduleOptions $activeFullBackupOptions $indexingOptions --nosnap
請注意,如果您使用 go 這條路線,則需要在流程中的所有其他點安全地對它們進行雙引號,尤其是在將它們傳遞給configureBackupJob
function 時。 如果分詞發生得太早,只會弄得一團糟。
如果您需要將選項類型分開並在選項中允許空格和/或有趣的字符,那就更難了。 您可能很想在選項中添加引號和/或轉義符來控制它,但分詞不尊重這些,因此它不起作用。 我想我只會向您推薦這個問題,並希望這不適用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.