Shell-Script

將帶有空格的選項/參數/參數從腳本傳遞到其中的函式

  • May 4, 2020

大家好,提前感謝。

我已經在論壇中搜尋了我的情況,但無法找到解決方案。我有一個腳本,我在命令行傳遞參數/選項/參數。其中一個值有一個空格,我用雙引號括起來。提供一個例子可能更容易。請原諒我對參數/選項/參數的使用。

$:  ./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)。

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