![](/img/trans.png)
[英]Environment variable passed to bash script is empty inside function
[英]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,如間接或namerefs
或declare
實用程序。 沒有eval
,沒有alias
,只有 100% POSIX。 您只需將變量名稱傳遞給makeGetSet
,並且您的 getter/setter 函數具有相同的名稱,末尾帶有“ Val
”(例如myVariableVal
)。 用bash
和dash
測試。 您可以繼續使用“普通”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 $var1
和func1 $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.