Shell-Script

將“$@”放在破折號中的局部變數中

  • July 26, 2019

"$@"我有一個 Bash 函式,它通過將它放在一個局部變數中來對其參數作為一個整體 () 進行一些字元串操作,如下所示:

#!/bin/sh

my_func() {
   local args="$@"
   echo "args: <$args>"
}

my_func "$@"

當我在 Bash 中執行它時,args包含所有傳遞的參數:

$ bash foo.sh foo bar baz
foo bar baz

但是,如果我在 Dash 中執行它,則只儲存第一個參數:

$ dash test.sh foo bar baz
args: <foo>

閱讀Ubuntu Wiki 的“Dash as /bin/sh”頁面中的部分local,似乎 Dash 正在local args="$@"像這樣擴展該行:

local args=foo bar baz

因此僅將“foo”放入並將args其聲明為(本地?)變數。事實上,如果我在參數中添加並執行它,似乎可以確認我正在添加變數:bar``baz``echo "bar: $bar"``my_func``=

$ foo.sh foo bar=baz
args: <foo>
bar: baz

說了這麼多,有沒有辦法$args在 Dash 中獲得類似 Bash 的行為(包含“foo bar baz”)?

POSIX 標準指定$@in的擴展。shell將創建一個以空格分隔的字元串,其中包含所有位置參數作為變數的值,同時將嘗試執行(等)local args="$@" bash``args``dash``local args="$1" "$2" "$3"

zsh和shell的ksh行為類似於bash(從位置參數創建單個字元串,儘管zsh將使用第一個字元$IFS作為分隔符),而yashshell 的行為類似於dash,至少在它們的預設配置中是這樣。

在您的情況下,您應該使用

my_func () {
   local args
   args="$*"

   printf 'args: <%s>\n' "$args"
}

或者

my_func () {
   local args="$*"

   printf 'args: <%s>\n' "$args"
}

我在$*這裡使用是為了清楚地表明我正在從值列表構造單個字元串。$IFS該字元串將包含位置參數的值,由(預設為空格)的第一個字元分隔。

我還printf用來確保獲得使用者提供的值的正確輸出(請參閱為什麼 printf 比 echo 更好?)。

此外,您的腳本應該#!/bin/dash用作第一行,而不是#!/bin/sh作為標準語法local的擴展。sh

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