5

I use the below code to assign a given by the user character to variable G:

read G 

However in order to move forward with executing of my script I need to press enter button. Is it possible to set the read command somehow that it show process forward to the next line immediately after it receive the one letter from stdin?

2 Answers 2

5

If you're using Bash:

read -n1 G 

Your system is configured to use dash by default and dash doesn't support this feature, so you also need to change the first line of your script to specify that you wish you use bash:

#!/bin/bash 
Sign up to request clarification or add additional context in comments.

12 Comments

This doesn't work, it doesn't wait for the input anymore just allows to execute my loop until the end.
That's probably because you have errors elsewhere in your script. Try typing it in a new empty script and you'll find that it works just fine.
So you're saying that read -n1 G should pause the script until it receives on character from stdin and then continue executing without waiting for enter to be clicked?
BTW: the clean testing script I wrote as you suggested gives me this message: "read: 4: Illegal option -n" can that be because I'm writing in "#!/bin/sh"?
I tested this using bash. What shell are you using?
|
3

I thought dd might be able to do this, so I tried it out and didn't get anywhere. However, Google found this for me and I adapted it here:

readOne () { local oldstty oldstty=$(stty -g) stty -icanon -echo min 1 time 0 dd bs=1 count=1 2>/dev/null stty "$oldstty" } 

Define this function once at the beginning of your script, then you can use it like this:

char=$(readOne) # get the character echo $char # print the character (or you can do something else with it) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.