Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Oct 2009 15:37:33 -0400
From:      carmel_ny <carmel_ny@hotmail.com>
To:        freebsd-questions@freebsd.org
Subject:   Re: Using bash with MySQL
Message-ID:  <BLU0-SMTP74561AD6B03BDC639EC79D93B90@phx.gbl>
In-Reply-To: <4AE71D33.9000102@infracaninophile.co.uk>
References:  <BLU0-SMTP742AE1BC94A0883AC0162393B90@phx.gbl> <4AE71D33.9000102@infracaninophile.co.uk>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 27 Oct 2009 16:17:55 +0000
Matthew Seaman <m.seaman@infracaninophile.co.uk> replied:

>carmel_ny wrote:
>> I am in the process of writting a script that will use MySQL as a
>> back end. For the most part, I have gotten things to work correctly.
>> I am having one problem though.
>> 
>> Assume a data base:
>> 
>> database: MyDataBase
>> table: MyTable
>> field: defaults
>> 
>> Now, I have populated the 'defaults' fields with the declare
>> statements that I will use in the script. They are entered similar to
>> this:
>> 
>> 	declare -a MSRBL_LIST
>> 
>> Now, I issue this from my bash script:
>> 
>> SQL_USER=user			# MySQL user
>> SQL_PASSWORD=secret		# MySQL password
>> DB=MyDataBase			# MySQL data base name
>> HOST=127.0.0.1                  # Server to connect to
>> NO_COLUMN_NAME="--skip-column-names"
>> COM_LINE="-u${SQL_USER} -p${SQL_PASSWORD} -h ${HOST}
>> ${NO_COLUMN_NAME}" table=MyTable
>> 
>> 
>> DECLARE_STATEMENTS=($(mysql ${COM_LINE} -i -e"use ${DB}; SELECT
>> defaults FROM "${table}" WHERE 1;"))
>> 
>> for (( i=0;i<${#DECLARE_STATEMENTS[*]};i++)); do
>> echo  ${DECLARE_STATEMENTS[i]}
>> done
>> 
>> This output is produced:
>> 
>> declare
>> -a
>> MSRBL_LIST
>> 
>> Obviously, I want the output on one line for each field. I have tried
>> enclosing the variables with both single and double quote marks;
>> however, that does not work. Fields that do not contain spaces are
>> displayed correctly.
>> 
>> Obviously, I am doing something really stupid here. I hope someone
>> can assist me. I probably should ask this on the MySQL forum;
>> however, I was hoping that someone here might be able to supply a
>> remedy.
>
>This loop is where it all goes horribly wrong:
>
>for (( i=0;i<${#DECLARE_STATEMENTS[*]};i++)); do
>  echo  ${DECLARE_STATEMENTS[i]}
>done
>
>In Posix shell, the intended functionality would be more usually coded
>like this:
>
>IFS=$( echo ) for ds in $DECLARE_STATEMENTS ; do
>   echo $ds
>done
>
>where $DECLARE_STATEMENTS is split on any characters present in $IFS --
>the input field separators, here set to be just a newline character.
>(You don't have to use echo to do that; you can just put a literal
>newline between single quotes, but it's hard to tell all the different
>forms of whitespace apart if you're reading code snippets in an
>e-mail...)
>
>I suspect similar IFS trickery would work with bash, but I'm not
>familiar with the array syntax stuff it uses.  /bin/sh is perfectly
>capable for shell programming and positively svelte when compared to
>bash and it's on every FreeBSD machine ever installed, so why bother
>with anything else?

Matthew, unfortunately, that is not the problem. However, you post
pointed me in the right direction.

Notice this line: (should all be on one line)

DECLARE_STATEMENTS=($(mysql ${COM_LINE} -i -e"use ${DB}; SELECT defaults FROM "${table}" WHERE 1;"))

I am saving the output of the MySQL search in an array. Unfortunately,
the array is assuming that each space in the returned search is a new
element. I have not found out a way to prevent this. If you have any
suggestions, I would appreciate them.

I have tried putting: IFS=$( echo ) before the 'DECLARE_STATEMENTS'
call; however, that produces this error:

./scamp-sql: line 128: syntax error near unexpected token `)'
./scamp-sql: line 128: `DECLARE_STATEMENTS=$(mysql ${COM_LINE} -i -e"use ${DB}; SELECT defaults FROM ${table} WHERE '1';"))'

I know the principal is correct because I tried this code snippet:

IFS=$( echo )
a="1 2 3"
b=($a)
echo ${b[0]}

1 2 3

CONCAT would not benefit me either since the 'space' would still exist
in the returned search query. I might have to devise some hack to
combine the three elements into one. Fortunately, there are three
parts to every element. Unfortunately, there are a lot of them.

-- 
Jerry
gesbbb@yahoo.com

|::::=======
|::::=======
|===========
|===========
|

Sweater, n.:
A garment worn by a child when its mother feels chilly.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BLU0-SMTP74561AD6B03BDC639EC79D93B90>