Bash中是否有一种方法(不调用第二个脚本)来解析变量,就好像它们是命令行参数一样?我希望能够用引号等对它们进行分组。
示例:
this="'hi there' name here"
for argument in $this; do
echo "$argument"
done
应打印(但显然不是)
hi there
name
here
答案 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
会将*
扩展为模式,匹配当前目录中的每个文件。