Как ссылаться на массив с функцией до Bash4.3

На UNIX-системах обычно Perl уже установлен, и Net::FTP - модуль Perl CORE, например, тоже установлен. Тогда можно обойтись без дополнительного программного обеспечения (grep находится в последней строке):

perl -MNet::FTP -e '
    $ftp = Net::FTP->new(q[ftp.example.com]) or die $!; 
    $ftp->login(q[ftp],q[user@host]) or die $ftp->message; 
    $ftp->cwd(q[pub/whatever]) or die $ftp->message;
    print "$_\n" for grep { /pattern/ } $ftp->ls
'
2
06.12.2018, 22:25
1 ответ

В старых bash вам потребуется «переменная косвенность» (4-й абзац Расширение параметров оболочки ), что действительно уродливо для массивов:

myArray=('1' '2' '3' '4' '5')
myFunction() {
    local arr="${1}[@]"         # array expansion *as a string*
    local values=( "${!arr}" )  # actual array expansion
    echo "${values[@]}"
}
myFunction myArray
1 2 3 4 5

Обратите внимание, что это дает вам копию массива. Любые изменения, которые вы делаете в функции, не изменят myArrayво внешней области:

myFunc2_old () {
    local arr="${1}[@]"
    local values=( "${!arr}" )  # here's the copy
    values[0]=foo
    declare -p values
}
myFunc2_old myArray; declare -p myArray
declare -a values=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")
declare -a myArray=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")

В отличие от namerefs

myFunc2_ref () {
    local -n arr=$1
    arr[0]=foo
    declare -p arr
}
myFunc2_ref myArray; declare -p myArray
declare -n arr="myArray"
declare -a myArray=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")
4
27.01.2020, 22:02

Теги

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