2013-01-15 91 views
2

输入变量解析的bash变量包含:用于命令和命令选项

key1-key2-key3_command 

输出需要是:

command -k key1 -k key2 -k key3 

警告:按键数量可以从1至3

我已经计算了破折号的数量,并用if语句为每个密钥创建一个布尔指标(即key1 = 1,unset key2)。然后,我打算使用类似${parameter:+word}的东西来添加密钥,如果该密钥的标志被设置。它开始变得有点混乱,所以我想我会问在这里实现这个目标的最好方法是什么。

回答

1
echo "key1-key2-key3_command" | sed -r 's/(.*?)-(.*?)-(.*?)_(.*?)/\4 -k \1 -k \2 -k \3/g' 
command -k key1 -k key2 -k key3 
5
var='key1-key2-key3_command' 

IFS=_ read -r keys command <<< "$var" # Split $var at underscores. 
IFS=- read -ra keys   <<< "$keys" # Split $keys at dashes, -a to save as array. 

for key in "${keys[@]}"; do    # Treat $command as an array and add 
    command+=(-k "$key")     # -k arguments to it. 
done 

echo "${command[@]}" 

注:

  • 这个处理键任意数量。
  • 处理带有空格的键。
  • $IFS的更改只是暂时的;它们不会影响后续命令。
  • 如果要执行该命令,请将最后一行更改为"${command[@]}"(无回显)。
+0

这很好,谢谢! – spizzak

0

运行在一个子shell避免污染当前IFS和位置PARAMS

( 
    IFS="-_" 
    set -- $var 
    command=("${!#}") 
    while [[ "$1" != "${command[0]}" ]]; do 
     command+=(-k "$1") 
     shift 
    done 
    echo "${command[@]}" 
) 

删除 “回声” 来执行。