Bash

Bashrc 函式 case 語句從 JSON 導入案例

  • August 7, 2021

我正在製作一個 .bashrc 函式來讓我更快地了解系統。我用一個案例陳述來說明我想去哪裡。

function da() {
case "$1" in 
   home)   cd ~
           ;;
   eolas) cd /home/eolas/
          ;;
esac
}

我想從 JSON 文件中導入案例,例如:

{
 "cases": {
   "home": "~",
   "eolas": "/home/eolas/",
   "jdan": "/home/jdan/",
   "kl": "/.kl/"
 }
}

我已經在尋找一種方法來做到這一點,但到目前為止還沒有找到,這可能在 bash 中嗎?如果是這樣怎麼辦?

如果你有一個 JSON 文件,你應該自動考慮使用jq來解析它。

您需要將該文件讀入關聯數組:

declare -A __dirmap
while IFS=$'\t' read -r name dir; do
   [[ $dir == "~" ]] && __dirmap[$name]=$HOME || __dirmap[$name]=$dir
done < <(
   jq -r '.cases | to_entries[] | [.key, .value] | @tsv' file.json
)

那麼函式可以

function da() {
   if [[ -v __dirmap[$1] ]]; then
       cd "${__dirmap[$1]}"
   else
       echo "No mapping for $1" >&2
   fi
}

我將使用您的 JSON 來建構案例標籤及其相應目錄的關聯數組。這可以在您的~/.bashrc文件中完成一次:

unset _da_map
declare -A _da_map

if [ -f da_map.json ]; then
   eval "$(
           jq -r '.cases | to_entries[] |
                  @sh "_da_map[\(.key)]=\(.value)"' da_map.json
   )"
fi

(或者將它放在一個單獨的da_init函式中,以便在更改da_map.json文件時呼叫它。)

jq語句建構了許多評估的變數賦值eval。運算符引用 shell的@sh相關字元串。對於給定的範例,這將導致執行以下程式碼:

_da_map['home']='~'
_da_map['eolas']='/home/eolas/'
_da_map['jdan']='/home/jdan/'
_da_map['kl']='/.kl/'

然後da函式可以寫成

da () {
       command cd -- "${_da_map["$1"]?No mapping for label "'$1'"}"
}

這使用先前創建到cd與給定參數關聯的目錄的關聯數組。如果沒有找到給定參數的映射,則展開會產生錯誤:

$ da "hello world"
bash: _da_map["$1"]: No mapping for label 'hello world'

這種幼稚方法的一個問題是它不允許在 JSON 文件中的目錄值中進行波浪號擴展(或變數擴展)。因此,您應該在不使用~和不使用變數的情況下編寫路徑。

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