是否有等效于 python 的 shlex.split 的 bash 内置函数或表达式?如果它不仅可以处理空格,而且可以处理任何 IFS,那就太好了。
我有一个包含一堆简单 bash 命令的文件。
cat a_filename
ls a\ filename\ with\ spaces
less "another with spaces"
ln -s "this is" my\ favorite
echo $(I do not mind if this does not work)
我想要做的是通过将每一行上的命令拆分为参数数组来逐行处理这个文件。我可以用 shlex.split 在 python 中简单地做到这一点:
>>> import shlex
>>> for line in open("/tmp/example"):
... print(shlex.split(line))
...
['cat', 'a_filename']
['ls', 'a filename with spaces']
['less', 'another with spaces']
['ln', '-s', 'this is', 'my favorite']
['echo', '$(I', 'do', 'not', 'mind', 'if', 'this', 'does', 'not', 'work)']
请注意,我对非 bash 解决方案或使用 eval 或手工转义的解决方案不感兴趣。以下示例不是一个好的解决方案,因为它允许命令注入。
$ cat /tmp/example_line
cat "this is" not\ ok $(date)
$ eval "array=($(cat /tmp/example_line))"
$ echo ${array[@]}
cat this is not ok Sun Jan 13 17:13:44 CET 2019