Во-первых, измените свою подпись вызова так, чтобы суффикс пришел first :
push2 42 ./temp*
Тогда функция должна быть определена просто как
push2 () {
local -a scpProxy
local prefix suffix
suffix=$1
shift
gen_prefix "$suffix"
scp "${scpProxy[@]}" "$@" "testuser@$prefix.$suffix:"
}
где gen_prefix
выглядит примерно так:
gen_prefix () {
case $1 in
42) scpProxy=()
prefix=10.3.3
;;
89) scpProxy=(-o ProxyJump=user@server)
prefix=123.456.789
;;
esac
}
После вызова shift
, $@
содержит только файлы, которые вы хотите передать.scpProxy
- это массив, содержащий несколько отдельных аргументов для передачи scp
;если он пуст, то "${scpProxy[@]}"
расширится до 0 аргументов, а не пустой строки.
(Использование ./temp*
вместо temp*
защищает от совпадений, которые содержат :
и поэтому может быть ошибочно принято заимя удаленного файла.)
Хотя gen_prefix
, кажется, определяет свои переменные "глобально", на самом деле он просто определяет их в любой области видимости gen_prefix
, , называется from (bash
используетдинамическая область видимости, а не лексическая область видимости, как в большинстве других распространенных языков).Два вызова local
гарантируют, что все, что назначит gen_prefix
, останется внутри push2
и не будет видно после выхода push2
.
В качестве дополнительного примечания большая часть этой функции может исчезнутьс подходящей конфигурацией ssh
.Учтите это в вашем .ssh/config
файле:
Host somehost
User testuser
Hostname 10.3.3.42
Host someotherhost
User testuser
Hostname 123.456.789.89
ProxyJump user@server
Теперь вам не нужно push2
вообще;просто запустите
scp temp* somehost:
или
scp temp* someotherhost:
, и правильные адреса и параметры будут использованы автоматически.Конфигурация ssh
заменяет все, что gen_prefix
сделал, и без необходимости вызывать gen_prefix
больше нет необходимости переносить scp
.