Как извлечь значение, которое сценарий присваивает переменной среды, вне сценария?

я бы избежал ЛЮБОГО ppa, который не говорит ни о названии самого приложения, либо о том, что имя приложения включает такие слова, как Stable, если вы не захотите исправить какие-либо потенциальные проблемы, которые могут возникнуть из-за использования нестабильной или альфа-версии или бета или тестирование PPA. пусть разработчики / пользователи, которые действительно хотят протестировать / попробовать, попытаться исправить любые проблемы.

0
задан 27 July 2017 в 04:56

6 ответов

Вы можете использовать одну команду нажать [F8] для этого.

это извлекает на [F9] из строки export OMP_NUM_THREADS=N и печатает их по одному в строке, где на [F11] - это последовательность одной или более десятичных цифр (0-9):

grep -hoP '^export OMP_NUM_THREADS=\K\d+' test1.sh test2.sh

печатается:

8 4

предупреждения

Вы можете заметить, это несколько похоже на способ wjandrea это. Подобное решение, это будет работать при условии, что:

Вы знаете, что файлы называются [F12] и [от f13] (или как там их звали на самом деле), так что вы можете получить список имен файлов в командной. Вам не придется беспокоиться о возможности нескольких спичек в файл, или вы хотите их всех. Вполне допустимо, что текст справа от последней цифрой игнорируется, даже если нет места. Это, вероятно, не проблема; по-видимому, вы имеете некоторый контроль над этими скриптами (или кому-то ты доверяешь), и они не собираются отдавать нечисловые значения в OMP_NUM_THREADS. Однако, одна разумная альтернатива заключается в использовании \b после \d+, чтобы гарантировать появления матча на границе слова (и не получить результат, если это не так).

и как любое решение, которое не выполняет очень сложный анализ (который способ wjandrea это!д9]), это предполагает, что:

Вы знаете, что файлы называются [F12] и [от f13] (или как там их звали на самом деле), так что вы можете получить список имен файлов в командной. отметим также, что если переменная экспортируется, потом назначается без export строение, новое значение будет также экспортировать значение. export экспорт переменной и при необходимости назначает ее, но на самом деле это разные вещи ... когда вы измените значение, что относится к экспортируемой переменной. Аналогично, можно скрипт, чтобы удалить переменные из окружения после их экспорта. (См. этот пост долго Нейтан для деталей.)

, что параметры командной строки [f25 привод датчика] сделать:

отметим также, что если переменная экспортируется, потом назначается без export строение, новое значение будет также экспортировать значение. export экспорт переменной и при необходимости назначает ее, но на самом деле это разные вещи ... когда вы измените значение, что относится к экспортируемой переменной. Аналогично, можно скрипт, чтобы удалить переменные из окружения после их экспорта. (См. этот пост долго Нейтан для деталей.) Вам не придется беспокоиться о возможности нескольких матчей каждого файла, или вы хотите их всех. в -P использует флаг Perl совместимые регулярные выражения (pcre вместе). Я использую это регулярное выражение диалекта, потому что он поддерживает \K (см. ниже).

, что каждая часть рисунка ^export OMP_NUM_THREADS=\K\d+ назначение:

в -P использует флаг Perl совместимые регулярные выражения (pcre вместе). Я использую это регулярное выражение диалекта, потому что он поддерживает \K (см. ниже). export OMP_NUM_THREADS= соответствует самому себе буквально. вполне допустимо, что текст справа от последней цифрой игнорируется, даже если нет места. Это, вероятно, не проблема; по-видимому, вы имеете некоторый контроль над этими скриптами (или кому-то ты доверяешь), и они не собираются отдавать нечисловые значения в OMP_NUM_THREADS. Однако, одна разумная альтернатива заключается в использовании \b после \d+, чтобы гарантировать появления матча на границе слова (и не получить результат, если это не так). [f36 в] совпадает с
границы слова ([fунции f37]) один или несколько раз (+). Они не должны быть одинаковые цифры.

извлечение оба значения отдельно, в третьем сценарии.

Вы говорили, что планируете написать третий скрипт, который использует эти значения. Как лучше сделать, что не может быть полного ответа, основанный на том, что вы спрашивали до сих пор. Однако, часто хочется запечатлеть отдельные значения в отдельные переменные оболочки.

Вы можете извлечь значение из test1.sh в переменной оболочки n1 и значение test2.sh в переменной оболочки n2 подобное:

#!/bin/sh get_num_threads() { grep -oP '^export OMP_NUM_THREADS=\K\d+' "$1" } n1="$(get_num_threads test1.sh)" n2="$(get_num_threads test2.sh)"

это использует команду, чтобы получить выход grep что в противном случае было бы написано в stdout. А не писать [пулемет f44] команда дважды или введения второго шага процесса очень[!выход Д16], я положил его в функцию Shell. Функция вызывается дважды, чтобы назначить [f45 С] и n2; "$1" расширяет test1.sh в первом вызове и test2.sh во втором.

[размером d57]Вы бы положить все, что код, который вы хотите запустить сценарий, который использует значения, хранящиеся в n1 и n2, после приведенного выше кода.[!размером d57] export OMP_NUM_THREADS= соответствует самому себе буквально. если вы хотите, чтобы скрипт запустить с другой оболочке, чем [f55, которая], измените #!/bin/sh линия hashbang. Если вы только планируете исходный скрипт (. scriptname), вы можете удалить его; помните, что любой снаряд источников скрипт будет вам get_num_threads, n1, и [от f60] определили, если вы впоследствии сбросить их. [f36 в] совпадает с границы слова ([fунции f37]) один или несколько раз (+). Они не должны быть одинаковые цифры.

, чтобы проиллюстрировать текущее поведение несколько совпадающих строк в одном файле, считается что произойдет, если добавить следующие строки в команду скрипт, он печатает каждый матч в окружении [ ] и отделяется пустой строкой:

printf '[%s]\n\n' "$n1" "$n2"

предположим [f68 не] имеет один матч (8) и test2.sh состоит из двух матчей (4 и 5). Затем вы получаете:

[8] [4 5]

это означает, что [р70] содержит 4 и 5, разделенные символом новой строки, так как grep выводит их.

2
ответ дан 18 July 2018 в 09:36

Если оба находятся в одной папке с именем find:

grep -R -i "OMP_NUM_THREADS=[0-9]*" find/ | cut -d':' -f2 | sed -e 's/[^0-9]*//g'

Простейшая версия:

grep -R -i "OMP_NUM_THREADS=[0-9]*" find/ | cut -d':' -f2 | cut -d'=' -f2

Примеры файлов:

test1.sh --> export OMP_NUM_THREADS=8, export OMP_NUM_THREADS=20 test2.sh --> export OMP_NUM_THREADS=8

Выход:

8 20 8

Объяснение:

grep рекурсивно проходит через папку с целевыми файлами и находит записи с OMP_NUM_THREADS и имеет набор цифр в конце после = знак. grep передает свои результаты разрезанию, которое разделяет их на основе : (введено grep) и принимает второе значение поля. cut затем переходит к другой команде cut или к команде sed. Если задан cut, он повторяет то, что сделала предыдущая команда cut, но на этот раз отделяет значения на основе символа =. Если он передан в sed, он выполняет поиск и удаление не цифр и возвращает результаты.
0
ответ дан 18 July 2018 в 09:36
grep -oP '(?<=^export OMP_NUM_THREADS=)[0-9]+' test1.sh test2.sh

Объяснение:

grep -o печатать только соответствующую часть строки grep -P, используя Perl-совместимое регулярное выражение (?<=...), не считая ... как часть совпадения. Это позитивный взгляд. ^ представляет начало строки, в этом контексте [0-9]+ соответствует одной или нескольким цифрам
1
ответ дан 18 July 2018 в 09:36

Вы можете использовать одну команду нажать [F8] для этого.

это извлекает на [F9] из строки export OMP_NUM_THREADS=N и печатает их по одному в строке, где на [F11] - это последовательность одной или более десятичных цифр (0-9):

grep -hoP '^export OMP_NUM_THREADS=\K\d+' test1.sh test2.sh

печатается:

8 4

предупреждения

Вы можете заметить, это несколько похоже на способ wjandrea это. Подобное решение, это будет работать при условии, что:

Вы знаете, что файлы называются [F12] и [от f13] (или как там их звали на самом деле), так что вы можете получить список имен файлов в командной. Вам не придется беспокоиться о возможности нескольких спичек в файл, или вы хотите их всех. Вполне допустимо, что текст справа от последней цифрой игнорируется, даже если нет места. Это, вероятно, не проблема; по-видимому, вы имеете некоторый контроль над этими скриптами (или кому-то ты доверяешь), и они не собираются отдавать нечисловые значения в OMP_NUM_THREADS. Однако, одна разумная альтернатива заключается в использовании \b после \d+, чтобы гарантировать появления матча на границе слова (и не получить результат, если это не так).

и как любое решение, которое не выполняет очень сложный анализ (который способ wjandrea это!д9]), это предполагает, что:

Вы знаете, что файлы называются [F12] и [от f13] (или как там их звали на самом деле), так что вы можете получить список имен файлов в командной. отметим также, что если переменная экспортируется, потом назначается без export строение, новое значение будет также экспортировать значение. export экспорт переменной и при необходимости назначает ее, но на самом деле это разные вещи ... когда вы измените значение, что относится к экспортируемой переменной. Аналогично, можно скрипт, чтобы удалить переменные из окружения после их экспорта. (См. этот пост долго Нейтан для деталей.)

, что параметры командной строки [f25 привод датчика] сделать:

отметим также, что если переменная экспортируется, потом назначается без export строение, новое значение будет также экспортировать значение. export экспорт переменной и при необходимости назначает ее, но на самом деле это разные вещи ... когда вы измените значение, что относится к экспортируемой переменной. Аналогично, можно скрипт, чтобы удалить переменные из окружения после их экспорта. (См. этот пост долго Нейтан для деталей.) Вам не придется беспокоиться о возможности нескольких матчей каждого файла, или вы хотите их всех. в -P использует флаг Perl совместимые регулярные выражения (pcre вместе). Я использую это регулярное выражение диалекта, потому что он поддерживает \K (см. ниже).

, что каждая часть рисунка ^export OMP_NUM_THREADS=\K\d+ назначение:

в -P использует флаг Perl совместимые регулярные выражения (pcre вместе). Я использую это регулярное выражение диалекта, потому что он поддерживает \K (см. ниже). export OMP_NUM_THREADS= соответствует самому себе буквально. вполне допустимо, что текст справа от последней цифрой игнорируется, даже если нет места. Это, вероятно, не проблема; по-видимому, вы имеете некоторый контроль над этими скриптами (или кому-то ты доверяешь), и они не собираются отдавать нечисловые значения в OMP_NUM_THREADS. Однако, одна разумная альтернатива заключается в использовании \b после \d+, чтобы гарантировать появления матча на границе слова (и не получить результат, если это не так). [f36 в] совпадает с
границы слова ([fунции f37]) один или несколько раз (+). Они не должны быть одинаковые цифры.

извлечение оба значения отдельно, в третьем сценарии.

Вы говорили, что планируете написать третий скрипт, который использует эти значения. Как лучше сделать, что не может быть полного ответа, основанный на том, что вы спрашивали до сих пор. Однако, часто хочется запечатлеть отдельные значения в отдельные переменные оболочки.

Вы можете извлечь значение из test1.sh в переменной оболочки n1 и значение test2.sh в переменной оболочки n2 подобное:

#!/bin/sh get_num_threads() { grep -oP '^export OMP_NUM_THREADS=\K\d+' "$1" } n1="$(get_num_threads test1.sh)" n2="$(get_num_threads test2.sh)"

это использует команду, чтобы получить выход grep что в противном случае было бы написано в stdout. А не писать [пулемет f44] команда дважды или введения второго шага процесса очень[!выход Д16], я положил его в функцию Shell. Функция вызывается дважды, чтобы назначить [f45 С] и n2; "$1" расширяет test1.sh в первом вызове и test2.sh во втором.

[размером d57]Вы бы положить все, что код, который вы хотите запустить сценарий, который использует значения, хранящиеся в n1 и n2, после приведенного выше кода.[!размером d57] export OMP_NUM_THREADS= соответствует самому себе буквально. если вы хотите, чтобы скрипт запустить с другой оболочке, чем [f55, которая], измените #!/bin/sh линия hashbang. Если вы только планируете исходный скрипт (. scriptname), вы можете удалить его; помните, что любой снаряд источников скрипт будет вам get_num_threads, n1, и [от f60] определили, если вы впоследствии сбросить их. [f36 в] совпадает с границы слова ([fунции f37]) один или несколько раз (+). Они не должны быть одинаковые цифры.

, чтобы проиллюстрировать текущее поведение несколько совпадающих строк в одном файле, считается что произойдет, если добавить следующие строки в команду скрипт, он печатает каждый матч в окружении [ ] и отделяется пустой строкой:

printf '[%s]\n\n' "$n1" "$n2"

предположим [f68 не] имеет один матч (8) и test2.sh состоит из двух матчей (4 и 5). Затем вы получаете:

[8] [4 5]

это означает, что [р70] содержит 4 и 5, разделенные символом новой строки, так как grep выводит их.

2
ответ дан 24 July 2018 в 19:23

Если оба находятся в одной папке с именем find:

grep -R -i "OMP_NUM_THREADS=[0-9]*" find/ | cut -d':' -f2 | sed -e 's/[^0-9]*//g'

Простейшая версия:

grep -R -i "OMP_NUM_THREADS=[0-9]*" find/ | cut -d':' -f2 | cut -d'=' -f2

Примеры файлов:

test1.sh --> export OMP_NUM_THREADS=8, export OMP_NUM_THREADS=20 test2.sh --> export OMP_NUM_THREADS=8

Выход:

8 20 8

Объяснение:

grep рекурсивно проходит через папку с целевыми файлами и находит записи с OMP_NUM_THREADS и имеет набор цифр в конце после = знак. grep передает свои результаты разрезанию, которое разделяет их на основе : (введено grep) и принимает второе значение поля. cut затем переходит к другой команде cut или к команде sed. Если задан cut, он повторяет то, что сделала предыдущая команда cut, но на этот раз отделяет значения на основе символа =. Если он передан в sed, он выполняет поиск и удаление не цифр и возвращает результаты.
0
ответ дан 24 July 2018 в 19:23
grep -oP '(?<=^export OMP_NUM_THREADS=)[0-9]+' test1.sh test2.sh

Объяснение:

grep -o печатать только соответствующую часть строки grep -P, используя Perl-совместимое регулярное выражение (?<=...), не считая ... как часть совпадения. Это позитивный взгляд. ^ представляет начало строки, в этом контексте [0-9]+ соответствует одной или нескольким цифрам
1
ответ дан 24 July 2018 в 19:23

Другие вопросы по тегам:

Похожие вопросы: