代碼:
#test.sh
test_func(){
var1="$1"
var2="$1"
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1="$1"
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
}
test_func "$1"
var1="$1"
var2="$1"
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1=$1
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
使用帶有輸入 SAMPLE_INPUT 的 bash 輸出:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset: SAMPLE_INPUT
使用 ksh 輸出:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset: sample_input
var1 before typeset: sample_input
var2 before typeset: sample_input
var1 after typeset: sample_input
var2 after typeset: sample_input
我不明白為什么函式中的 bash clobbers var2 以及為什么在從 $1 中重新獲取值時,更改函式內部的變數會影響函式外部的值。我認為這與他們對區域變數和全域變數的實作有關。
我想要的輸出在 bash 和 ksh 以及函式的內部/外部是相同的:
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
功能外使用:
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
uj5u.com熱心網友回復:
在 bash 中,typeset是 的別名declare,它在函式內部呼叫時使變數成為區域變數,除非-g添加了引數。
在 ksh 中,typeset根據您定義函式的方式具有不同的行為: 使用test_func() { ... }創建的變數typeset是全域的;function test_func { ... }他們是本地人。因為您使用的是test_func() {語法,所以在您的 ksh 代碼中,typeset參考預先存在的全域變數而不是創建區域變數;所以保留原始值。
如果你想要相同的行為,你需要移到typeset函式之外,或者-g在 shell 是 bash 時添加;后者可以通過-g僅在BASH_VERSION設定時發出的引數擴展來完成,如下所示:
test_func(){
var="$1"
echo "var before typeset: $var"
typeset ${BASH_VERSION -g} -l var="$1"
echo "var after typeset: $var"
}
var="SAMPLE_INPUT"
test_func "$var"
echo "var after function: $var"
...正確發出:
var after function: sample_input
...即使在 bash 上。
至于空值,如果您更改函式宣告語法以typeset默認創建本地變數,即使在 ksh 上也會得到:
function test_func {
typeset -l var
var="$1"
}
test_func "SAMPLE_INPUT"
echo "Result is: <$var>"
...發射,Result is: <>在 ksh 中運行時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410607.html
標籤:
