Using bash with MySQL
carmel_ny
carmel_ny at hotmail.com
Tue Oct 27 19:37:36 UTC 2009
On Tue, 27 Oct 2009 16:17:55 +0000
Matthew Seaman <m.seaman at 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 at yahoo.com
|::::=======
|::::=======
|===========
|===========
|
Sweater, n.:
A garment worn by a child when its mother feels chilly.
More information about the freebsd-questions
mailing list