Bash

如何在別名或函式中使用全域變數數組

  • July 29, 2014

我試圖簡化重複的工作程序。為此,我正在嘗試編寫一個 .bashrc 腳本,該腳本將設置別名可以引用的全域路徑變數。免責聲明:我是 linux 和一般腳本的新手,所以我不知道我採取的方法是否正確。

這是我到目前為止所寫的。

SET_DIR=/var/www/

#Set the current site's root directory
function sroot (){
   SET_DIR=/var/www/$1
   setaliases
   echo $SET_DIR
}

#Reinitialize aliases with new sroot
function setaliases(){
   alias chk="echo $SET_DIR"
   alias rt="cd $SET_DIR"
   alias thm="cd $SET_DIR/sites/all/themes/"
   alias mod="cd $SET_DIR/sites/all/modules"
}

setaliases

我想做的是擴展這個想法以在數組或文件中定義站點。然後使用一個函式來檢查傳遞給 sroot 函式的值。這將反過來在其他函式中設置變數。

#myfile or array
site=example1.com
theme=alpha
shortcut=x1 

site=example2.com
theme=beta
shortcut=x2

因此,例如“sroot x1”會影響

SET_DIR=/var/www/$site
# and
alias thm="cd $SET_DIR/sites/all/themes/$theme"

如何配置函式以檢查數組中的值然後使用它的變數?

當你寫:

alias thm="cd $SET_DIR/sites/all/themes/"

SET_DIR您在定義別名時正在擴展 的值。這意味著每次執行別名時都會獲得相同的值,即使您在兩者之間更改了變數值。如果您使用反斜杠轉義,$那麼當您使用別名時,該變數將被取消引用:

$ foo=hello
$ alias test="echo \$foo"
$ test
hello
$ foo=world
$ test
world

因此,如果您以這種方式定義別名,那麼當您更改SET_DIR. 您還可以單引號引用別名定義。

對於您的數據文件,Bash 4 及更高版本支持關聯數組,它可以讓您像這樣定義數據:

declare -A theme site # This makes these variables associative arrays
add_site() {
   local shortcut=$1
   theme[$shortcut]=$2
   site[$shortcut]=$3
}
add_site x1 example1.com alpha
add_site x2 example2.com beta

然後,您可以使用 eg 訪問這些值${theme[x1]}。然後,您的別名可以採用以下形式:

alias thm="cd /var/www/\${site[\$CURRENT]}/sites/all/themes/\${themes[\$CURRENT]}"

然後,您的sroot功能將設置CURRENT為您想要的鍵。別名將始終將您帶到目前站點中的正確目錄。

還有其他方法可以特別定義數組,但這將為您提供總體構想。

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