分析bash中有空格的单个字符串参数
将单个字符串参数(中间有空格)解析为bash脚本的最佳方法是什么分析bash中有空格的单个字符串参数,bash,shell,eval,Bash,Shell,Eval,将单个字符串参数(中间有空格)解析为bash脚本的最佳方法是什么 #!/bin/bash eval $@ echo $OPT1 echo $OPT2 echo $OPT3 echo $OPT4 当选项为下面的一个单词时,eval工作正常 ./args.sh 'OPT1=1 OPT2=2 OPT3=3 OPT4=4' 1 2 3 4 ./args.sh 'OPT1=1 OPT2=2 OPT3=3.1 3.2 OPT4=4' 但当我的论点如下时就不是了 ./args.sh 'OPT1=1
#!/bin/bash
eval $@
echo $OPT1
echo $OPT2
echo $OPT3
echo $OPT4
当选项为下面的一个单词时,eval工作正常
./args.sh 'OPT1=1 OPT2=2 OPT3=3 OPT4=4'
1 2 3 4
./args.sh 'OPT1=1 OPT2=2 OPT3=3.1 3.2 OPT4=4'
但当我的论点如下时就不是了
./args.sh 'OPT1=1 OPT2=2 OPT3=3 OPT4=4'
1 2 3 4
./args.sh 'OPT1=1 OPT2=2 OPT3=3.1 3.2 OPT4=4'
解析上述图形的更好方法是什么
请注意,我无法控制输入参数,我使用的是第三方二进制文件,它只是将这些参数作为单个字符串生成
是否有任何类似于eval的命令可以根据一些分隔符进行解析,在我的例子中,'='
eval
总是很危险的。幸运的是,有一种更安全、更可靠的方法来定义变量,那就是使用声明
请尝试以下脚本:
$ cat args.sh
#!/bin/bash
old=$IFS
IFS=$'\n'
declare "$(sed -E 's/ +([[:alnum:]]+=)/\n\1/g' <<<"$*")"
IFS=$old
#Verify that declare was succesful:
declare -p OPT1 OPT2 OPT3 OPT4
工作原理
#/bin/bash
这条shebang行指定bash作为shell
old=$IFS
这将保存IFS的旧值
IFS=$'\n'
这将IFS设置为一个换行符
声明“$(sed-E's/+([[:alnum:]+=)/\n\1/g”对3.2
会发生什么?它是OPT3
的一部分还是作为单独的参数处理?它应该是OPT3的一部分