英文:
Saving grep output to variable changes value
问题
I want to use grep
to determine if a string contains a substring. (The plan is to use that result as the test command in a bash if
statement.)
Here, I check the length of the output of grep
. :
$ echo "abc" | grep "j" | wc -c
0
Since wc -c
shows zero, I know that grep
returned an empty string.
But if I save output from grep
to a variable before calling wc -c
, I get a different value:
$ match=$(echo "abc" | grep "j")
$ echo "$match" | wc -c
1
The output from grep
now is a string with 1 character in it.
I suspect that it's a newline in there:
$ echo "$match"
$
Why is there now an extra character in $match
, and how can I keep that from happening?
英文:
I want to use grep
to determine if a string contains a substring. (The plan is to use that result as the test command in a bash if
statement.)
Here, I check the length of the output of grep
. :
$ echo "abc" | grep "j" | wc -c
0
Since wc -c
shows zero, I know that grep
returned an empty string.
But if I save output from grep
to a variable before calling wc -c
, I get a different value:
$ match=$(echo "abc" | grep "j")
$ echo "$match" | wc -c
1
The output from grep
now is a string with 1 character in it.
I suspect that it's a newline in there:
$ echo $match
$
Why is there now an extra character in $match
, and how can I keep that from happening?
答案1
得分: 2
match
不包含换行符,但echo "$match"
会写入一个换行符(但请参考下面的注释)。在第一种情况下,您直接将grep
的输出传递给wc
,但在第二种情况下,您将grep
的输出和一个换行符一起传递给wc
。
但最好根本不这样做。无需引入wc
来解决这个问题。只需测试grep返回的值。例如:
if ... | grep -q "$pattern"; then echo "$pattern在输入中找到了"; fi
注意,echo "$match"
是不良实践。例如,考虑如果$match
扩展为字符串-e
或-n
。使用printf '%s' "$match"
要更加健壮。
英文:
match
does not contain a newline, but echo "$match"
writes a newline (but see note below). In the first case, you are directly passing the output of grep
to wc
, but in the second case you are passing the output of grep
plus a newline to wc
.
But don't do this at all. There is no need to introduce wc
into the problem. Just test the value returned by grep. eg:
if ... | grep -q "$pattern"; then echo "$pattern was found in the input"; fi
Note, echo "$match"
is bad practice. For example, consider if $match
expands to the string -e
or -n
. It is much more robust to use printf '%s' "$match"
答案2
得分: 1
请注意以下内容:
$ echo "$match" | od -c
0000000 \n
0000001
$ echo "$match" | wc -c
1
$ printf "$match" | od -c
0000000
$ printf "$match" | wc -c
0
这两个命令的唯一区别是echo
在输出的末尾附加了\n
。
当然,我们也可以通过在printf
中明确添加\n
来生成相同的结果:
$ printf "$match\n" | od -c
0000000 \n
0000001
$ printf "$match\n" | wc -c
1
英文:
Consider the following:
$ echo "$match" | od -c
0000000 \n
0000001
$ echo "$match" | wc -c
1
$ printf "$match" | od -c
0000000
$ printf "$match" | wc -c
0
The only difference in the 2 commands is that echo
appends a \n
on the end of the ouput.
Of course, we can make the printf
generate the same result by explicitly adding a \n
on the end:
$ printf "$match\n" | od -c
0000000 \n
0000001
$ printf "$match\n" | wc -c
1
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论