Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分析bash中有空格的单个字符串参数_Bash_Shell_Eval - Fatal编程技术网

分析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

将单个字符串参数(中间有空格)解析为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 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的一部分