將帶有空格的選項/參數/參數從腳本傳遞到其中的函式
大家好,提前感謝。
我已經在論壇中搜尋了我的情況,但無法找到解決方案。我有一個腳本,我在命令行傳遞參數/選項/參數。其中一個值有一個空格,我用雙引號括起來。提供一個例子可能更容易。請原諒我對參數/選項/參數的使用。
$: ./test1.ksh -n -b -d "Home Videos"
我的問題是將變數設置為“家庭影片”並將其一起使用。在我的範例中, -d 是指定一個目錄。並非所有目錄都有空格,但在我的情況下有一些。
這是我所擁有的程式碼範例,它沒有按我的預期工作。
#!/bin/ksh Function1() { echo "Number of Args in Function1: $#" echo "Function1 Args: $@" SetArgs $* } SetArgs() { echo -e "\nNumber of Args in SetArgs: $#" echo "SetArgs Args: $@" while [ $# -gt 0 ] do case $1 in -[dD]) shift export DirectoryName=$1 ;; -[nN]) export Var1=No shift ;; -[bB]) export Var2=Backup shift ;; *) shift ;; esac done Function2 } Function2() { echo "Directory Name: ${DirectoryName}" } Function1 $*
當我執行它時,我只得到 DirectoryName 的 Home 而不是 Home Videos。見下。
$ ./test1.ksh -n -b -d "Home Videos" Number of Args in Function1: 5 Function1 Args: -n -b -d Home Videos Number of Args in SetArgs: 5 SetArgs Args: -n -b -d Home Videos Var1 is set to: No Var2 is set to: Backup Directory Name: Home
我所期待但未能實現的是:
$ ./test1.ksh -n -b -d "Home Videos" Number of Args in Function1: 4 Function1 Args: -n -b -d "Home Videos" Number of Args in SetArgs: 4 SetArgs Args: -n -b -d "Home Videos" Var1 is set to: No Var2 is set to: Backup Directory Name: Home Videos <-- Without double quotes in the final usage.
我能得到的任何幫助將不勝感激……我試過轉義雙引號,但沒有任何成功。
感謝您花費時間和精力幫助我解決這個問題。
問候,丹尼爾
使用
$*
或不$@
引用永遠沒有意義。
"$*"
是位置參數與 的第一個字元(或字節,取決於外殼)的串聯,是位置參數$IFS
的"$@"
列表。當不帶引號時,它是相同的,但會像任何其他不帶引號的參數擴展一樣受到 split+glob (或僅使用 空刪除)(即使為空
zsh
,某些 shell 也會分隔參數)。$*``$IFS
在這裡,您想將參數列表按原樣傳遞給您的函式,因此它是:
SetArgs "$@" [...] Function1 "$@"
請注意,對於 ksh88,
$IFS
必須包含空格字元(預設情況下)才能正常工作(從 Bourne shell 繼承的錯誤,在 ksh93 中修復)。另請注意,對於某些實現(如仿真中
ksh
的舊版本),zsh``ksh
export DirectoryName=$1
是一個 split+glob 呼叫案例。
export
是類似 Korn 的 shell 中的命令之一,可以通過數組索引中的算術評估來評估 shell 程式碼),因此這是引用變數以避免引入命令注入漏洞的重要情況之一。例子:
$ (exec -a ksh zsh-4.0.1 -c 'export x=$a' ksh 'foo psvar[0`uname>&2`]') Linux
請注意,這
[ $# -gt 0 ]
是另一個沒有意義的 split+glob 呼叫(至少在預設值的情況下不太可能成為問題$IFS
)。