FotisK
FotisK

Reputation: 1177

How to pass value to read variable with pipe (stdin) in bash

I read a lot about passing piping stdin to bash read function, but nothing seems to work for my bash version!!

GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)

I have a bash script that in some point asks the user "yes/no" with variable CONTINUEQUESTION:

echo "Do you want to continue? (yes/no):"
read CONTINUEQUESTION
tmp=$(tr '[:upper:]' '[:lower:]' <<<$CONTINUEQUESTION)
if [[ "$tmp" != 'y'  &&  "$tmp" != 'yes' ]]; then
                echo "Aborting because of input '$CONTINUEQUESTION'"
                exit
fi

I would like to pipe a "yes or no" to this question without user input! Yes i know i could use expect, but i don't prefer it in this case.

So i tried several things:

CONTINUEQUESTION='yes'
echo $CONTINUEQUESTION | ./myscript.sh

Aborting because of input ''

./myscript.sh <<< "$CONTINUEQUESTION"

Aborting because of input ''

...and many other, nothing worked!?

O.k. now I did a bit revers thinking and find out that the below line causes the problem with the pipe...because when i remarked it out all the below answers are working just fine, but not when this line is executed:

running=`ssh root@${HOSTNAME} 'su - root -c "/bin/tools list | grep \"system running\"" 2>&1'`

But, i need this line before the read! What do i need to reverse the 2>&1????

My script look like this and is working without this try to over come the user intervantion:

LIST_FILE_NAME=$1
STILL_RUNNING=0

running=`ssh root@${HOSTNAME} 'su - root -c "cat '$LIST_FILE_NAME' | grep \"system running\"" 2>&1'`
if [[ $running =~ .*running.* ]]; then
        STILL_RUNNING=1
        echo "NODE $NODE running stop before continuing."
fi
if [ $STILL_RUNNING -eq 1 ]; then
        echo "Aborting system was still running!"
        exit 1
fi

echo "Do you want to continue? (yes/no):"
read CONTINUEQUESTION

tmp=$(tr '[:upper:]' '[:lower:]' <<<$CONTINUEQUESTION)
if [[ "$tmp" != 'y'  &&  "$tmp" != 'yes' ]]; then
                echo "Aborting because of input '$CONTINUEQUESTION'"
                exit
fi

echo "o.k."

4 points:

  1. list.log can have a line with "system running" or "system notrunning"
  2. if list.log has a line with "system notrunning" than the bash script continue towards the question
  3. at the question i never got it right to inject the 'y' or 'yes' so the bash aborts because of input ''
  4. i execute this like: ./myscript.sh list list.log (normal way)

This bash runs well if the user interacts at the question!

Thanks for you time!!!

Upvotes: 1

Views: 2708

Answers (3)

anubhava
anubhava

Reputation: 784888

You can use heredoc:

bash -ex ./myscript.sh << 'EOF'
yes
EOF

Search for Here Documents in man bash.

EDIT: Based on comments you can use this ssh command:

running=$(ssh -t -t root@${HOSTNAME} "grep 'system running' \"$LIST_FILE_NAME\"")

Upvotes: 0

konsolebox
konsolebox

Reputation: 75458

Consider this variation as well:

#!/bin/bash
read -p "Do you want to continue? (yes/no): " CONTINUEQUESTION
if [[ $CONTINUEQUESTION != [Yy] && $CONTINUEQUESTION != [Yy][Ee][Ss] ]]; then
    echo "Aborting because of input '$CONTINUEQUESTION'."
    exit
fi

Tested with:

bash script.sh <<< yes

If it doesn't work, show the output of:

bash -x script.sh <<< yes

Upvotes: 3

damienfrancois
damienfrancois

Reputation: 59072

Your line

$CONTINUEQUESTION='yes'

shoul really be

CONTINUEQUESTION='yes'

I am not sure then that your are feeding stdin with the word 'yes'. You could add an echo after the read to be sure.

Upvotes: 3

Related Questions