簡體   English   中英

在 bash 中傳遞給函數的變量名

[英]Name of variable passed to function in bash

bash 中有沒有辦法理解傳遞給它的變量的名稱?

例子:

var1=file1.txt
err_var=errorfile.txt

function func1 {
   echo "func1: name of the variable is: " $1
   echo "func1: value of variable is: " $1 
   echo
   if [ ! -e $var1 ]
   then
      $1 = $err_val  #is this even possible?
   fi
   func2 $1
}

function func2 {
   echo "func2: name of the variable is: " $1
   echo "func2: value of variable is: " $1 
   echo
}

func1 $var1
func1 $err_var

如果 file1.txt 存在,我希望得到以下輸出:

func1: name of the variable is: var1
func1: value of variable is: file1.txt

func2: name of the variable is: var1
func2: value of variable is: file1.txt

當 file1.txt 不存在時:

func1: name of the variable is: var1
func1: value of variable is: file1.txt

func2: name of the variable is: err_var
func2: value of variable is: errorfile.txt

有任何想法嗎?

不,變量在函數看到它之前被擴展。 該函數只看到值,而不是變量名。

如果傳遞未擴展且沒有美元符號的變量名,則可以使用間接。

get_it () {
    echo "${!1}"
}

演示:

$ foo=bar
$ baz=qux
$ get_it foo
bar
$ get_it baz
qux

就像丹尼斯說的那樣,一旦你使用美元符號擴展了變量,你的函數就不再有辦法獲取變量名了。 但是我認為您還詢問了一種設置變量值的方法,而該部分尚未得到解答。 有一些不可移植的方法可以做到這一點,例如declare -n (如果您感興趣,請使用 Google),但我的答案將堅持通用解決方案。

我是一名C++程序員,所以我喜歡模仿“ getter 和 setter ”的哲學,在那里你使用微小的函數來獲取和設置變量的值。 使用 getter 和 setter 的缺點是您需要為每個要管理的值創建一個函數(或兩個函數)。 所以......我做了一個“工廠函數”來為你創建 getter/setter:

makeGetSet() {
. /dev/fd/0 <<END_FUNC
${1}Val()  { [ "\${1}" ] && ${1}="\${1}" || echo "\${${1}}"; }
END_FUNC
}

它不需要任何具有特殊功能的特定 shell,如間接或namerefsdeclare實用程序。 沒有eval ,沒有alias ,只有 100% POSIX。 您只需將變量名稱傳遞給makeGetSet ,並且您的 getter/setter 函數具有相同的名稱,末尾帶有“ Val ”(例如myVariableVal )。 bashdash測試。 您可以繼續使用“普通”shell 方式結合我的函數來讀/寫變量。

用法:

Setup: makeGetSet myVariable
Set: myVariableVal newValue
Get: anotherVariable="`myVariableVal`"
Print: myVariableVal

我不確定你腳本的幾個部分,所以我做了一些有根據的猜測。 if [ ! -e $var1 ] if [ ! -e $var1 ] ,我想你的意思是if [ ! -e $1 ] if [ ! -e $1 ] 最后,在你調用函數的地方,你有func1 $var1func1 $err_var ,但我認為你打算只使用func1 $var1或有第三個變量。 看起來$err_var是“錯誤的默認值”,而不是您作為輸入提供的內容,但也許我沒有遵循您的想法。

所以我對你的問題的回答如下:

var1=file1.txt; makeGetSet var1
err_var=errorfile.txt; makeGetSet err_var

function func1 {
   echo "func1: name of the variable is: " ${1%Val}
   echo "func1: value of variable is: " `${1}`
   echo
   # Shorter than if..fi
   [ ! -e `${1}` ] && ${1} ${err_val}
   func2 ${1}
}

function func2 {
   echo "func2: name of the variable is: " ${1%Val}
   echo "func2: value of variable is: " `${1}` 
   echo
}

func1 ${var1}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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