На 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
'
В старых 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")