Как «использовать» конкретную переменную

uniq сделает это за вас:

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna
4
17.04.2020, 02:29
4 ответа

Можно определить область действия переменных с помощью функций. Пример:

## Provider.sh
# Global vars
declare -A map

# Wrap the rest of Provider.sh in a function

provider() {

    # Local vars only available in this function
    declare a=hello b=world c d


    # Global vars are available
    map[hello]=world

}

provider "$@"    # Execute function, pass on any positional parameters

# Remove function
unset -f provider

$ cat Consumer.sh
../Provider.sh
echo "${map[hello]}"
echo "$a"
$ bash -x Consumer.sh
+../Provider.sh
++ declare -A map
++ provider
++ declare a=hello b=world c d
++ map[hello]=world
++ unset -f provider
+ echo world
world
+ echo ''

7
19.03.2021, 02:28

Я не верю, что есть способ получить только часть сценария оболочки. Вы можете либо получить все это целиком, либо вообще ничего.

Однако вы можете использовать grepдля извлечения из файла только тех строк, которые вам нужны, и записать их в новый файл, который затем можно будет использовать в качестве источника. Это, конечно, не сработает, если у вас есть сложная функция, которая встраивается в ваш код.

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

1
19.03.2021, 02:28

Вы можете использовать функцию и сделать переменные локальными или глобальными:

#!/bin/bash

foo() {
  declare -gA MAP # make global
  local A=hello # make local
  local B=world # make local
  MAP[hello]=world
}

foo

Тогда:

#!/bin/bash
source./Provider.sh
[[ -z "$A" ]] && echo "Variable A not defined"
[[ -z "$B" ]] && echo "Variable B not defined"
echo ${MAP[hello]}

Выход:

Variable A not defined
Variable B not defined
world
3
19.03.2021, 02:28

Когда вы говорите sourceи имеете два файла, я думаю, что вы хотите, чтобы две команды были доступны в командной строке, и хотите, чтобы провайдер установил переменную для использования потребителем позже. (А, я вижу, что потребители исходного кода являются производителями, поэтому они будут использовать одно и то же пространство имен, а потребитель не будет загрязнять вызывающее пространство имен.

Я использую функции для некоторых псевдонимов bash _и исходный файл, который включает определения функций из .bashrc. Таким образом, они устанавливают и используют переменные в текущей оболочке, а не в подоболочке, где они исчезнут после ее запуска.

Когда у меня есть файл bash, который должен быть получен для работы, я добавляю в него напоминание сshebang:

#!/bin/echo "You have to source this file (${BASH_SOURCE}), not run it"
# -*-mode:sh;sh-shell:bash;fill-column:84-*-

Обратите внимание, что вместо /bin/bash используется /bin/echo, поэтому при запуске выводится только первая строка.

Также ${BASH_SOURCE}даст пользователю подсказку о расположении файла.

Вторая строка # -*-mode:sh;sh-shell:bash;fill-column:84-*-предназначена для Emacs, чтобы понять, как выделить файл и сделать отступ, когда я его редактирую.

Две функции, предоставляемые гостевой системой, великолепны, но если их поместить в отдельные файлы, они не будут активны, если вы просто запустите файлы.

Итак, я взял гостевой код здесь, но с некоторыми изменениями, чтобы сделать то, что, как я думаю, вам может понадобиться. Также при условии, что они будут помещены в файл для получения.

#!/bin/echo "You have to source this file (${BASH_SOURCE}), not run it"
# -*-mode:sh;sh-shell:bash;fill-column:84-*-
# define producer and consumer functions

declare -A MAP  # you might want to use a different name 
                # because this is going to be in your global namespace

function provider() {
    local A=hello
    local B=world
    MAP[hello]=world   
}

## However maybe what you are wanting is a setter function instead?
function providerSetter() {
    MAP[${1}] = ${2}
}

function consumer()
    echo ${MAP[hello]}
}

## Again, you might want a getter function
function consumerGetter()
    echo ${MAP[${1}]}
}

## you can put defaults into the second functions, i.e.,
function providerSetter2() {
    MAP[${1:-hello}] = ${2:-world}
}
function consumerGetter2()
    echo ${MAP[${1:-hello}]}
}

Добро пожаловать на форум!

0
19.03.2021, 02:28

Теги

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