I wrote a collection of bash functions years ago and now need to use them again but
I'm getting some error messages when eval tries to expand the variables names.
I recollect that I used the shopt command to set one of the options but I can't quite
remember the command that I used. However, I may be wrong regarding the shopt
command.
Anyway, the function in question is:
function array_load
{
local IFS=$'\n'
eval "$1=( \$( < \"\${$2}\" ) )"
}
This is the output from the sh -x command:
+ declare -i __ITR__
+ declare -a __FILE_SQL__
+ declare -a __TEMP_SQL__
+ array_load __FILE_SQL__ __SRC__
+ local 'IFS=
'
+ eval '__FILE_SQL__=( $( < "${__SRC__}" ) )'
++ __FILE_SQL__=($( < "${__SRC__}" ))
/Users/Shared/#BASHLIB/type/array.bash: line 53: ~/djia.csv: No such file or directory
The __SRC__ variable contains a relative reference to a file i.e. ~/djia.csv but I've also
tried using an absolute reference from the root directory which also does not get found.
Remember! Only on bash version 4.0.x and above.
We Apple users and probably others only have version 3.2.x so associative arrays are a none starter.
As the OP has not quoted his bash version nor the OS and HW in use then we can only assume he MIGHT have bash version 4.0.x[plus] available.
$ ./z1
Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Apple/BSD, Darwin 18.7.0, x86_64
Distribution : macOS 10.14.6 (18G103), Mojave
zsh 5.3
-----
Input file data1:
red=stop
green=go
yellow=caution
-----
Results:
Plain print:
caution stop go
Values:
caution stop go
Keys:
yellow red green
Both vertically:
yellow
caution
red
stop
green
go
The problem is ~ is not being expanded. It turns out to be a little tricky to expand ~ but also avoid word separation on the path name (white spaces in you array source filename).
Try:
function array_load
{
local IFS=$'\n'
local ARR_FILE=$(eval echo ${!2})
eval "$1=( \$( < \"$ARR_FILE\" ) )"
}
RudiC although your replace works for ~/dir/path it would not work for ~root/data/mydatafile or /home/dba/data~files/myarray.dat .
The function in post #7 supplies a more accurate expansion.