Это различие между родительской и дочерней оболочками.
Когда вы запускаете test.sh
, запускается новая оболочка для его запуска; переменная экспортируется в эту оболочку. Это означает, что новая оболочка знает об этом и всех своих дочерних элементах. На родительскую оболочку, из которой вы запустили test.sh
, это никак не влияет (и не может быть).
Чтобы увидеть переменную в вашей текущей оболочке, вам нужно вместо этого создать исходный сценарий:
. test.sh
(с пробелом между .
и test.sh
). Это запустит test.sh
без запуска новой оболочки.
Есть возможность показать только первое совпадение. Обратите внимание:
$ grep -iE "(foo|bar|test|something)" filename.txt
Foo 1
Bar 2
foo 3
Foo 4
Теперь, чтобы ограничить это первым совпадением, добавьте -m1
:
$ grep -iEm1 "(foo|bar|test|something)" filename.txt
Foo 1
Ограничение состоит в том, что это покажет только первое совпадение, а не первое foo
а также первую полосу
и т. д.
Рассмотрим этот тестовый файл:
$ cat filename.txt
Foo 1
Bar 2
foo 3
Foo 4
test 5
test 6
Чтобы распечатать первое совпадение для каждого из трех показанных регулярных выражений:
$ awk -v a='[fF]oo [bB]ar [tT]est' 'BEGIN{split(a,b," ")} {for (i in b) if ($0~b[i] && !c[i]) {print; c[i]++}}' filename.txt
Foo 1
Bar 2
test 5
Это работает путем помещения любых регулярных выражений, которые вы хотите сопоставить, в переменную a
. a
разбивается на слова и помещается в массив b
. Каждое из регулярных выражений в b
проверяется для каждой строки, и печатается только первое совпадение для каждой.