将变量解析为参数?

时间:2013-10-26 07:12:41

标签: bash parsing arguments

Bash中是否有一种方法(不调用第二个脚本)来解析变量,就好像它们是命令行参数一样?我希望能够用引号等对它们进行分组。

示例:

this="'hi there' name here"

for argument in $this; do
    echo "$argument"
done

应打印(但显然不是)

hi there
name
here

3 个答案:

答案 0 :(得分:2)

我自己做了一个半答案。请考虑以下代码:

this="'hi there' name here"

eval args=($this)

for arg in "${args[@]}"; do
    echo "$arg"
done

打印所需的

输出
hi there
name
here

答案 1 :(得分:1)

使用gsed -r

echo "$this" | gsed -r 's/("[^"]*"|[^" ]*) */\1\n/g'
"hi there"
name
here

使用egrep -o

echo "$this" | egrep -o '"[^"]*"|[^" ]+'
"hi there"
name
here

纯BASH方式:

this="'hi there' name here"
s="$this"
while [[ "$s" =~ \"[^\"]*\"|[^\"\ ]+ ]]; do
    echo ${BASH_REMATCH[0]}
    l=$((${#BASH_REMATCH[0]}+1))
    s="${s:$l}"
done

"hi there"
name
here

答案 2 :(得分:1)

不要将参数存储在字符串中。为此目的发明了阵列:

this=('hi there' name here)

for argument in "${this[@]}"; do
    echo "$argument"
done

如果您控制this,强烈建议您使用此方法。如果不这样做,则更有理由不使用eval,因为非预期命令可以嵌入this的值中。例如:

$ this="'hi there'); echo gotcha; foo=("
$ eval args=($this)
gotcha

不那么邪恶的事情就像this="'hi there' *"一样简单。 eval会将*扩展为模式,匹配当前目录中的每个文件。