解析命令和命令选项的bash变量

时间:2013-01-15 20:24:45

标签: bash shell variables

输入变量包含:

key1-key2-key3_command

输出需要:

command -k key1 -k key2 -k key3

警告:键数可以从1到3不等。

我已计算破折号的数量,并使用if语句为每个键创建一个布尔指示符(即key1 = 1,未设置key2)。然后,如果设置了该键的标志,我将使用${parameter:+word}之类的内容添加密钥。它开始变得有点凌乱所以我想我会在这里询问最好的方法是什么。

3 个答案:

答案 0 :(得分: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[@]}"(无回声)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在子shell中运行以避免污染当前的IFS和位置参数

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

删除“echo”以执行。