我在从引号中删除字符串中的变量时遇到问题。我有一些脚本要为sys类编写,我的脚本有问题,其中我必须以(a = “ var1”,b =“ var2”)
我尝试了下面的代码
#!/bin/bash
read input
a=$($input | cut -d '"' -f3)
echo $a
它在第3行上向我返回了一个错误“找不到命令”,我试图在双括号中插入
a=$(($input | cut -d '"' -f3)
但是还是错误的。
答案 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
在这种情况下,您将使用sed
或grep
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