簡體   English   中英

在 Bash 腳本中傳遞 Arguments 時出現 Veeam CLI 未知參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM