gpt4 book ai didi

string - Bash:完全像 Readline 一样拆分字符串

转载 作者:行者123 更新时间:2023-11-29 09:28:54 25 4
gpt4 key购买 nike

给定任意 Bash 的字符串表示形式“simple command”,我如何将它拆分成包含其各个“部分”的数组,即命令名称和各个参数,就像 shell 本身一样(即 Readline) 会在解析它并决定运行哪个可执行文件/函数以及传递哪些参数时拆分它


我的特定用例需要解析用户定义的别名定义。例如。别名可以定义为:

alias c2="cut -d' ' -f2"  # just an example... arbitrary commands should be handled!

这就是我的 bash 脚本尝试解析它的方式:

alias_name="c2"
alias_definition=$(alias -p | grep "^alias $alias_name=") # "alias c2='cut -d'\'' '\'' -f2'"
alias_command=${alias_definition##alias $alias_name=} # "'cut -d'\'' '\'' -f2'"
alias_command=$(eval "echo $alias_command") # "cut -d' ' -f2"

alias_parts=($alias_command) # WRONG - SPLITS AT EVERY WHITESPACE!

echo "command name: ${alias_parts[0]}"

for (( i=1; i <= ${#alias_parts}; i++ )); do
echo "parameter $i : ${alias_parts[$i]}"
done

输出:

command name: cut
parameter 1 : -d'
parameter 2 : '
parameter 3 : -f2

期望的输出:

command name: cut
argument 1 : -d' '
argument 2 : -f2


我需要用什么来替换 alias_parts=($alias_command) 行,才能实现这一点?

最佳答案

正如 l0b0 所说,这不是 readline。是外壳本身在进行拆分。所以使用 shell 本身来进行解析。

alias c2="cut -d' ' -f2"

split_parts() {
alias_parts=("$@")
}

alias_defn=$(alias c2)
# 2 evals needed to get rid of quotes
eval eval split_parts ${alias_defn#alias c2=}

for (( i=0; i < ${#alias_parts}; i++ )); do
echo "parameter $i : \"${alias_parts[$i]}\""
done

输出

parameter 0 : "cut"
parameter 1 : "-d "
parameter 2 : "-f2"

请注意,-d 包含 shell 实际看到的尾随空格。

关于string - Bash:完全像 Readline 一样拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8939580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com