【发布时间】:2012-02-14 21:51:06
【问题描述】:
给定一个任意 Bash "simple command" 的字符串表示,我如何将它拆分为一个包含其各个“部分”的数组,即命令名称和各个参数,就像 shell 本身一样 ( ie 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) 行来实现这一点?
【问题讨论】:
标签: string bash split readline