首页 > 解决方案 > Bash:解析shell命令字符串

问题描述

ls a\ b "c d" $f给定一个shell 命令字符串bash([0]=ls [1]='a b' [2]='c d' [3]=<value of $f>)即 REPL 的 read() 部分。

我想写一个自定义bind -x函数,我需要解析当前的READLINE_LINE. 我试过read -a了,但这只需要处理反斜杠(例如"a b"被分成<"a>and <b">

标签: bashshellparsingreadline

解决方案


我希望您可以使用以下代码

#!/usr/bin/env bash
parse(){
    declare -g cmd
    local i
    for i in $(seq 1 $#); do
        cmd[$((i-1))]="${!i}"
    done
    declare -p cmd
}
touch "a b" "c d" "e"
f="e"
trap 'eval "parse $BASH_COMMAND"; trap -- DEBUG' DEBUG
ls a\ b "c d" $f
declare -p cmd

推荐阅读