Array with String Elements


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Array with String Elements
# 1  
Old 01-04-2010
Array with String Elements

How can I get my array to understand the double-quotes I'm passing into it are to separate text strings and not part of an element? here's what I'm working with...

Code:
db2 -v connect to foo

db2 -x "select '\"' || stats_command || '\",' from db2law1.parallel_runstats where tabname = 'BAZ'"
set -A runstatCmds `db2 -x "select '\"' || stats_command || '\"' from db2law1.parallel_runstats where tabname='BAZ'"`

echo "Number of array variables: ${#runstatCmds[@]}"
echo "First array variable: ${runstatCmds[0]}"
echo "Second array variable: ${runstatCmds[1]}"


set -A strings "foo bar" "boo far"
echo "First array variable: ${strings[0]}"
echo "Second array variable: ${strings[1]}"

db2 terminate

and the output is...

Code:
schmitty@prep001a:
/home/schmitty/tmp> sh unixpost.sh
connect to foo

   Database Connection Information

 Database server        = DB2/AIX64 9.1.7
 SQL authorization ID   = SCHMITTY
 Local database alias   = FOO


"runstats on table CD.BAZ with distribution and detailed indexes all allow write access",       
"runstats on table SCHMITTY.BAZ with distribution and detailed indexes all allow write access",   
Number of array variables: 26
First array variable: "runstats
Second array variable: on
First array variable: foo bar
Second array variable: boo far
DB20000I  The TERMINATE command completed successfully.

So what I'm looking to do is dynamically populate the array with the value of the query but I can't seem to get the array to handle the quoting properly.
# 2  
Old 01-04-2010
If I understood your situation correctly, I believe the solution is to use eval to pass the result of the command substitution though the shell's parser.

I'm using an old version of bash which does not support "set -A", so I'm using positional parameters instead of an array variable to try and explain myself. The principles involved are identical. Hopefully, I am able to get my point across Smilie

Code:
$cat eval.sh
# The goal is to assign the value of $first to $1
# and the value of $second to $2.

first='$second'  second='boo far'

# 1)
# This first example exhibits the problem you are
# experiencing.  The quotes intended to delimit the
# string are taken as part of the string itself,
# since command substitution occurs after the parsing
# step which cares about quoting.

set -- `echo \"$first\" \"$second\"`
echo "First positional parameter: $1"
echo "Second positional parameter: $2"

# Outputs:
# First positional parameter: "$second"
# Second positional parameter: "boo

# -----------------------------------------

# 2)
# Adding eval passes the result from command substitution
# through the parser, and the quotes are indeed interpreted
# as you'd like.  However, with weak double quotes, if
# there is anything in the substituted text that would
# cause the shell to attempt parameter/command substitution,
# the output will be undesirably affected. In this case, the
# value of $first, the string "$second", is taken as a parameter
# which is then substituted, resulting in the value of $1 
# being identical to that of $2.

eval set -- `echo \"$first\" \"$second\"`
echo "First positional parameter: $1"
echo "Second positional parameter: $2"

# Outputs:
# First positional parameter: boo far
# Second positional parameter: boo far

# -----------------------------------------

# 3)
# The correct solution is wrap the command substituted values
# in strong quotes, to ensure that they are taken literally and
# not word split when passed through the parser a second time.

eval set -- `echo \'$first\' \'$second\'`
echo "First positional parameter: $1"
echo "Second positional parameter: $2"

# Finally, the correct output:
# First positional parameter: $second
# Second positional parameter: boo far

Hope this helped,
alister

Last edited by alister; 01-04-2010 at 10:52 PM.. Reason: typos
# 3  
Old 01-04-2010
Code:
set -A strings '"foo bar"' '"boo far"'

Code:
strings=("\"foo bar\"" "\"boo far\"")

Code:
strings=("\"$(some cmd)\"" "\"boo far\"")


Last edited by Scrutinizer; 01-04-2010 at 11:00 PM..
# 4  
Old 01-04-2010
Quote:
Originally Posted by djschmitt
and the output is...
Somehow I completely missed the output section of your post, until after I had typed and submitted my earlier post. Perhaps the following will suffice:

Code:
eval set -A runstatCmds `db2 -x "select '\"' || stats_command || '\"' from db2law1.parallel_runstats where tabname='BAZ'" | tr -d ,`

That may be good enough, but if you wanted to be very cautious, changing the double quotes to single quotes would be a good idea. Double quoting the command substitution would preserve whitespace, but the embedded newline which seems to be in the db2 output would then cause problems with eval. A workaround for that would be to use tr to convert it to a space.

Take care,
alister
# 5  
Old 01-05-2010
Quote:
Originally Posted by alister
Somehow I completely missed the output section of your post, until after I had typed and submitted my earlier post. Perhaps the following will suffice:

Code:
eval set -A runstatCmds `db2 -x "select '\"' || stats_command || '\"' from db2law1.parallel_runstats where tabname='BAZ'" | tr -d ,`

That may be good enough, but if you wanted to be very cautious, changing the double quotes to single quotes would be a good idea. Double quoting the command substitution would preserve whitespace, but the embedded newline which seems to be in the db2 output would then cause problems with eval. A workaround for that would be to use tr to convert it to a space.

Take care,
alister
Simple enough - add the 'eval' before the 'set -A' and all is well. Thanks Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Get unique elements from Array

I have an array code and output is below: echo $1 while read -r fline; do echo "%%%%%%$fline%%%%%" fmy_array+=("$fline") done <<< "$1" Output: CR30903 YU0007 SRIL CR30903 Yogesh SRIL %%%%%%CR30903 YU0007 SRIL%%%%% %%%%%%CR30903 Yogesh SRIL%%%%% ... (8 Replies)
Discussion started by: mohtashims
8 Replies

2. Shell Programming and Scripting

Help reading the array and sum of the array elements

Hi All, need help with reading the array and sum of the array elements. given an array of integers of size N . You need to print the sum of the elements in the array, keeping in mind that some of those integers may be quite large. Input Format The first line of the input consists of an... (1 Reply)
Discussion started by: nishantrefound
1 Replies

3. Shell Programming and Scripting

Random elements from array

Hi I wanted to print random elements from an array at bash shell I use the following code, but I always see first element getting printed #!/bin/bash c=1 expressions=(pink red white yellow purple) while ]; do echo "The value of RANDOM is $RANDOM" selectedexpression=${expressions}]};... (5 Replies)
Discussion started by: Priya Amaresh
5 Replies

4. Shell Programming and Scripting

Multiplication of array elements

Hi, I can't find out how to create correct code to get multiplication of each elements of array. Let's say I enter array into command line (2 3 4 5 6 8) and i need output 2*3*4*5*6*8=5760. I tried this one, but answer is 0. for i in $@; do mult=$((mult*i))done echo "mult: " $mult ... (4 Replies)
Discussion started by: rimasbimas
4 Replies

5. Shell Programming and Scripting

Grouping array elements - possible?

I have a script which takes backup of some configuration files on my server. It does that by using an array which contains the complete path to the files to backup. It copys the files to a pre defined dir. Each "program" has it's own folder, ex. apache.conf is being copied to /predefined... (7 Replies)
Discussion started by: dnn
7 Replies

6. Shell Programming and Scripting

Removing elements from an array

Hi I have two arrays : @arcb= (450,625,720,645); @arca=(625,645); I need to remove the elements of @arca from elements of @arcb so that the content of @arcb will be (450,720). Can anyone sugget me how to perform this operation? The code I have used is this : my @arcb=... (3 Replies)
Discussion started by: rkrish
3 Replies

7. UNIX for Dummies Questions & Answers

printing array elements

Is there a way to print multiple array elements without iterating through the array using bash? Can you do something like... echo ${array}and get all those separate elements from the array? (2 Replies)
Discussion started by: jrymer
2 Replies

8. Shell Programming and Scripting

Accessing array elements

Hi, My doubt is how to access array elements.. Situation is as below: #!/bin/ksh set -x typeset -i x=0 typeset -i y=0 typeset -i BID=0 typeset -i count=0 while ] ; do x=`expr $x + 1`; hwmgr show scsi > scsi.tmp while read line; do set... (1 Reply)
Discussion started by: mansa
1 Replies

9. Shell Programming and Scripting

Search array elements as file for a matching string

I would like to find a list of files in a directory less than 2 days old and put them into an array variable. And then search for each file in the array for a matching string say "Return-code= 0". If it matches, then display the array element with a message as "OK". Your help will be greatly... (1 Reply)
Discussion started by: mkbaral
1 Replies

10. Shell Programming and Scripting

To return the elements of array

Hi, Please can someone help to return the array elements from a function. Currently the problem I face is that tempValue stores the value in myValue as a string while I need an array of values to be returned instead of string. Many Thanks, Sudhakar the function called is: ... (5 Replies)
Discussion started by: Sudhakar333
5 Replies
Login or Register to Ask a Question