[BASH] eval command not expanding variables as expected.


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers [BASH] eval command not expanding variables as expected.
# 1  
Old 11-16-2019
[BASH] eval command not expanding variables as expected.

Hi Guys,


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:
Code:
function array_load
 {
    local IFS=$'\n'
    eval "$1=( \$( < \"\${$2}\" ) )"
 }

This is the output from the sh -x command:
Code:
+ 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.


Any help would be appreciated.
TIA Guys. ;-)
# 2  
Old 11-16-2019
I'd trust the system when it complains a file not residing where it looks for it.
Did you make very sure that file exists?


What happens in your script is that bash's mapfile / readarray builtin is duplicated by using a "command substitution". man bash:
Quote:
The command substitution $(cat file) can be replaced by the equivalent but faster $(< file).
Above mentioned builtins serve the same purpose, offer some more options, and don't rely on the deprecated, dangerous eval command. man bash:
Quote:
mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
readarray [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
Read lines from the standard input into the indexed array variable array
Why don't you just abandon the function?

Last edited by RudiC; 11-16-2019 at 03:30 PM..
# 3  
Old 11-16-2019
you can also read from a file into an associative array
Code:
cat file
(
[apple]=123457
[mango]=123456
[orange]=1234567
)
declare -A arr
m=arr
eval $m=$(<file)
echo ${arr[@]}
1234567 123456 123457
echo ${!arr[@]}
orange mango apple

# 4  
Old 11-16-2019
probably
Code:
shopt -s extquote

# 5  
Old 11-17-2019
Hi nezabudka...
Quote:
you can also read from a file into an associative array
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.

Just an observation...
This User Gave Thanks to wisecracker For This Post:
# 6  
Old 11-24-2019
Hi.
Quote:
Originally Posted by wisecracker
Hi nezabudka...
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.

Just an observation...
I think those of us who use macos may need to get used to zsh. Here is a demo zsh script that was run on Mojave, not using eval:
Code:
#!/usr/bin/env zsh

# @(#) z1       Demonstrate feature.

set +o nounset
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && zsh $C
set -o nounset

FILE=${1-data1}

pl " Input file $FILE:"
head $FILE

# IFS=$'\n,'; h=($(<file.csv))
# https://unix.stackexchange.com/questions/464626/making-associative-array-based-on-another-associative-array
# Printing advice from:
# http://zsh.sourceforge.net/Guide/zshguide05.html#l122
pl " Results:"
typeset -A a
IFS=$'\n,\t='; a=($(<$FILE))

pe;pe " Plain print:"
print ${a}
pe;pe " Values:"
print ${(v)a}
pe;pe " Keys:"
print ${(k)a}
pe;pe " Both vertically:"
print -l "${(@kv)a}"

exit 0

producing:
Code:
$ ./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

Best wishes ... cheers, drl
These 2 Users Gave Thanks to drl For This Post:
# 7  
Old 11-24-2019
Quote:
Originally Posted by ASGR
Hi Guys,


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.
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:
Code:
function array_load
{
    local IFS=$'\n'
    local ARR_FILE=$(eval echo ${!2})
    eval "$1=( \$( < \"$ARR_FILE\" ) )"
}

These 2 Users Gave Thanks to Chubler_XL For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Bash argument not expanding in script

I pass an argument to bash as run. The first command in green executes as expected, however the second in blue fails as the $run does not expand. I tried to escape the variable with \ thinking the quotes were making the literal translation and also "${run}" but both did not work to expand the... (3 Replies)
Discussion started by: cmccabe
3 Replies

2. Shell Programming and Scripting

Possible ksh93 Bug Expanding Variables?

My OS is Linux (kernel 4.08.something) and AIX (7100-04-01-1543), the used ksh versions are: ksh88: Version M-11/16/88f (AIX) ksh93: Version M 93t+ 2009-05-01 (AIX), Version M 93u (Linux) When writing a parser for stanza files in ksh i encountered a rather strange behavior. Here is a... (4 Replies)
Discussion started by: bakunin
4 Replies

3. Shell Programming and Scripting

Error in eval eval command to print html tags

anyone has any info on why this is complaining??? vivek@vivek-c5e55ef2e ~/TAC $ zoneCounter=1 vivek@vivek-c5e55ef2e ~/TAC $ optUsage1=23% vivek@vivek-c5e55ef2e ~/TAC $ eval eval echo "<th>Zone $zoneCounter </th><th align=\"left\"> \$optUsage$zoneCounter </th>" -bash: syntax error... (13 Replies)
Discussion started by: vivek d r
13 Replies

4. Shell Programming and Scripting

Error in eval eval command to print html tags

anyone has any info on why this is complaining??? vivek@vivek-c5e55ef2e ~/TAC $ zoneCounter=1 vivek@vivek-c5e55ef2e ~/TAC $ optUsage1=23% vivek@vivek-c5e55ef2e ~/TAC $ eval eval echo "<th>Zone $zoneCounter </th><th align=\"left\"> \$optUsage$zoneCounter </th>" -bash: syntax error... (1 Reply)
Discussion started by: vivek d r
1 Replies

5. Shell Programming and Scripting

awk issue expanding variables in ksh script

Hi Guys, I have an issue with awk and variables. I have trawled the internet and forums but can't seem to get the exactt syntax I need. I have tried using awk -v and all sorts of variations but I have hit a brick wall. I have spent a full day on this and am just going round in circles. ... (3 Replies)
Discussion started by: gazza-o
3 Replies

6. Shell Programming and Scripting

dynamic variables - eval - expand etc.

Hello, so i'm making a script, using dynamic variables and trying to expand them. So far it hasn't worked out too well so it seems that I need some help from you, the elite. Example: #!/bin/sh counter=0 until (($counter>5)) counter2=1 until (($counter2>6)); do if ;... (5 Replies)
Discussion started by: TehOne
5 Replies

7. Shell Programming and Scripting

Dynamic variables and eval

Hi, I need some direction with the following. The below code is semi-psuedo code which will hopefully make it easier to understand what I am trying to achieve: for i in `echo ${testarray }` do let c=c+1 eval "first$c=$i" while... (4 Replies)
Discussion started by: yonderboy
4 Replies

8. UNIX for Dummies Questions & Answers

Expanding variables with Ed Bash 3.2.33

Hi, The following code finds the line containing fruits in test.txt and replaces instances of apple with banana. ed -s test.txt <<< $'/fruits/s/apple/banana/g\nw' What I want to do is put variables in the place of fruits, apple and banana. I have tried replacing ' with " to get... (2 Replies)
Discussion started by: de_la_espada
2 Replies

9. UNIX for Advanced & Expert Users

Expanding Variables in User Input

If have var='$variable' how can I expand $variable. I have tried many thing like duble quotes/braces etc, but nothing worked. I need the solution ASAP. (2 Replies)
Discussion started by: Bsk
2 Replies

10. Shell Programming and Scripting

expanding dotted paths to absolute ones in bash or sh

I have a little script to help me manage a gallery of image files. It makes symbolic links to every file in and below the current directory, placing them in a target directory which is passed to the script as a parameter. Unfortunately, the script pukes when I pass a parameter that contains... (4 Replies)
Discussion started by: TanRanger
4 Replies
Login or Register to Ask a Question