如何剪切字符串中的引号之间的变量

时间:2019-01-06 19:09:20

标签: bash unix

我在从引号中删除字符串中的变量时遇到问题。我有一些脚本要为sys类编写,我的脚本有问题,其中我必须以(a = “ var1”,b =“ var2”)

我尝试了下面的代码

#!/bin/bash
read input
a=$($input | cut -d '"' -f3)
echo $a

它在第3行上向我返回了一个错误“找不到命令”,我试图在双括号中插入

a=$(($input | cut -d '"' -f3)

但是还是错误的。

2 个答案:

答案 0 :(得分:0)

要从字符串1中提取数字"var1",您很有可能使用Bash子字符串替换:

$ s="var1"
$ echo "${s//[^0-9]/}"
1

或者,

$ a="${s//[^0-9]/}"
$ echo "$a"
1

这可以通过将字符串中的任何非数字替换为空来实现。在您的示例中该方法适用于字符串中的单个数字字段,但是如果您具有多个数字字段,则可能不是您所需要的:

$ s2="1 and a 2 and 3"
$ echo "${s2//[^0-9]/}"
123

在这种情况下,您将使用sedgrep awk或Bash正则表达式来捕获单个数字字段并使其与众不同:

$ echo "$s2" | grep -o -E '[[:digit:]]+'
1
2
3

答案 1 :(得分:0)

OP在评论中给出了有效的答案(应将其发布为答案):

#!/bin/bash
read input
a=$(echo $input | cut -d '"' -f2)
b=$(echo $input | cut -d '"' -f4)
echo sum: $(( a + b))
echo difference: $(( a - b))

这将适用于与a="8", b="5"类似的用户输入。
永远不要相信输入。 您可能要添加支票

if [[ ${input} =~ ^[a-z]+=\"[0-9]+\",\ [a-z]+=\"[0-9]+\"$ ]]; then
   echo "Use your code"
else
   echo "Incorrect input"
fi

添加检查时,您可能要执行输入(用分号替换逗号后)。

input='testa="8", testb="5"'
if [[ ${input} =~ ^[a-z]+=\"[0-9]+\",\ [a-z]+=\"[0-9]+\"$ ]];
then
   eval $(tr "," ";" <<< ${input})
   set | grep -E "^test[ab]="
else
   echo no
fi

编辑:
@Pesa关于BASH_REMATCH的正确评论:
当您使用bash并对输入进行测试时,可以使用

if [[ ${input} =~ ^[a-z]+=\"([0-9]+)\",\ [a-z]+=\"([0-9])+\"$ ]];
then
   a="${BASH_REMATCH[1]}"
   b="${BASH_REMATCH[2]}"
fi