uniq
сделает это за вас:
$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna
Можно определить область действия переменных с помощью функций. Пример:
## 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 ''
Я не верю, что есть способ получить только часть сценария оболочки. Вы можете либо получить все это целиком, либо вообще ничего.
Однако вы можете использовать grep
для извлечения из файла только тех строк, которые вам нужны, и записать их в новый файл, который затем можно будет использовать в качестве источника. Это, конечно, не сработает, если у вас есть сложная функция, которая встраивается в ваш код.
В любом случае лучше разделить этот код на несколько скриптов и использовать только то, что вам нужно. Если вы хотите иметь только один сценарий, вы также можете поместить свой код в несколько функций, получить его из разных мест,и вызовите только ту функцию, которая вам нужна.
Вы можете использовать функцию и сделать переменные локальными или глобальными:
#!/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
Когда вы говорите 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}]}
}
Добро пожаловать на форум!