Home > Back-end >  bash script stuck in single line
bash script stuck in single line

Time:01-21

I have below command for bash script:

#!/bin/sh
sqlserver=("localhost" "testserver") 
db="master" 
user="sa"
pass="test@12345"
for item in "${sqlserver[@]}"
do
    sqlcmd -S "$item" -d $db -U $user -P $pass -I -h-1  -Q "set nocount on;SELECT name as username FROM SYSUSERS WHERE NAME LIKE '%test%'" >> "$item".txt
    while IFS= read -r line; do
        if [ -n "$line" ]
         then 
         #echo "Text read from file: $line"
         sqlcmd -S "$item" -d $db -U $user -P $pass -I -b -h-1  -Q "set nocount on;drop user $line"
         fi
    done < "$item".txt
done

script is stuck at sqlcmd -S $item -d $DATABASE -U $USERNAME -P $PASSWORD -I -b -h-1 -Q "set nocount on;drop user $line". and this is going to in loop , it's goes infinity. how to get out from this if command.

I got the error as below:

Msg 15151, Level 16, State 1, Server 66752ccaf826, Line 1
Cannot drop the user 'test2', because it does not exist or you do not have permission.
Msg 15151, Level 16, State 1, Server 66752ccaf826, Line 1
Cannot drop the user 'test2', because it does not exist or you do not have permission.
Msg 15151, Level 16, State 1, Server 66752ccaf826, Line 1
Cannot drop the user 'test2', because it does not exist or you do not have permission.
Msg 15151, Level 16, State 1, Server 66752ccaf826, Line 1
Cannot drop the user 'test2', because it does not exist or you do not have permission.

Issue: How to break or exit loop once end of file? and after complete file it will go with 2nd sql server with continue for loop.

For create User:

CREATE USER test1 WITHOUT LOGIN;
CREATE USER test2 WITHOUT LOGIN;

Update1: If I use echo "Text read from file: $line" then if condition running properly but when I use sqlcmd -S "$item" -d $db -U $user -P $pass -I -b -h-1 -Q "set nocount on;drop user $line" then it goes to infinite loop.

CodePudding user response:

Assuming you want the while loop to end with the end-of-file of "$item.txt", then you need to change

if [[ ! -z $line ]]

to (for bash)

if [[ -z $line ]] ; then break ; fi

or (for sh)

if [ -z $line ] ; then break ; fi

and remove the other "fi".

As for the command

sqlcmd -S $item -d $DATABASE -U $USERNAME -P $PASSWORD -I -b -h-1  -Q "set nocount on;drop user $line"

you need to resolve the issue reported, from the shell command line, before attempting to do that within the script.

  • Related