Bash
Bashrc 函式 case 語句從 JSON 導入案例
我正在製作一個 .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 文件中的目錄值中進行波浪號擴展(或變數擴展)。因此,您應該在不使用
~
和不使用變數的情況下編寫路徑。