bash user input if

64,152

Solution 1

You might consider explicit prompting: -p and specifying 1-character-input -n1 which allows to insert y without ENTER.

read -n1 -p "Do that? [y,n]" doit 
case $doit in  
  y|Y) echo yes ;; 
  n|N) echo no ;; 
  *) echo dont know ;; 
esac

Solution 2

echo "Do that? [Y,n]"
read input
if [[ $input == "Y" || $input == "y" ]]; then
        echo "do that"
else
        echo "don't do that"
fi

Pay close attention to the syntax and spacing of the if conditional, it gets me all the time in bash :)

Solution 3

Look up the options to read in bash - you can do the prompting etc.

read -p "Do that? [Y,n]" -i Y input

For the rest, leave spaces around command names ('[' is a command - you might even find it in /bin/[ though it is also a shell built-in) and arguments.


Bash Manual, Chapter 4: Shell Builtin Commands

read

  read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars]  
       [-p prompt] [-t timeout] [-u fd] [name ...]

One line is read from the standard input, or from the file descriptor fd supplied as an argument to the ‘-u’ option, and the first word is assigned to the first name, the second word to the second name, and so on, with leftover words and their intervening separators assigned to the last name. If there are fewer words read from the input stream than names, the remaining names are assigned empty values. The characters in the value of the IFS variable are used to split the line into words. The backslash character ‘\’ may be used to remove any special meaning for the next character read and for line continuation. If no names are supplied, the line read is assigned to the variable REPLY. The return code is zero, unless end-of-file is encountered, read times out (in which case the return code is greater than 128), or an invalid file descriptor is supplied as the argument to ‘-u’.

Options, if supplied, have the following meanings:

-a aname The words are assigned to sequential indices of the array variable aname, starting at 0. All elements are removed from aname before the assignment. Other name arguments are ignored.

-d delim The first character of delim is used to terminate the input line, rather than newline. -e Readline (see Chapter 8 [Command Line Editing], page 93) is used to obtain the line. Readline uses the current (or default, if line editing was not previously active) editing settings. -i text If Readline is being used to read the line, text is placed into the editing buffer before editing begins.

-n nchars read returns after reading nchars characters rather than waiting for a complete line of input, but honor a delimiter if fewer than nchars characters are read before the delimiter.

-N nchars read returns after reading exactly nchars characters rather than waiting for a complete line of input, unless EOF is encountered or read times out. Delimiter characters encountered in the input are not treated specially and do not cause read to return until nchars characters are read.

-p prompt Display prompt, without a trailing newline, before attempting to read any input. The prompt is displayed only if input is coming from a terminal.

-r If this option is given, backslash does not act as an escape character. The backslash is considered to be part of the line. In particular, a backslash-newline pair may not be used as a line continuation.

-s Silent mode. If input is coming from a terminal, characters are not echoed.

-t timeout Cause read to time out and return failure if a complete line of input is not read within timeout seconds. timeout may be a decimal number with a fractional portion following the decimal point. This option is only effective if read is reading input from a terminal, pipe, or other special file; it has no effect when reading from regular files. If timeout is 0, read returns success if input is available on the specified file descriptor, failure otherwise. The exit status is greater than 128 if the timeout is exceeded.

-u fd Read input from file descriptor fd.

Solution 4

You need to put a blank Space between "if" and the variable:

if [ $var == "y" ]; then echo "ese era el problema" fi

Solution 5

You can use case modification operator:

if [ "${DECISION^^}" = "Y" ]; then
...
fi

You can find more in bash manual under "Parameter Expansion".

Share:
64,152

Related videos on Youtube

frnhr
Author by

frnhr

studying physics, programming php, C#, Microchip's PICs, playing piano, soldering, looking for a job... got a job... django rulz... wordpress is pretty ok... the company not so much... quit, got another job... mangento is ok... magento is not ok omg... django still rulz very much wanna do django work... quit, started freelancing... wordpress is evolving nicely some good plugins out there really... django is top... 1 year freelancing... python sage interesting... over 1k stackoverflow score gotta update my profile... over 7k score...

Updated on November 05, 2020

Comments

  • frnhr
    frnhr over 3 years

    I am tring to do simple

    Do you want to do that? [Y,n] _
    

    question in bash.

    i tried

    echo "Do that? [Y,n]"
    read DO_THAT
    if ["DO_THAT"="y"]; then
      do_that
    fi
    

    but it fails: bash: [y=y]: command not found

    what am I doing wrong??!

  • Kenny Cason
    Kenny Cason about 13 years
    Nice! +1 I didn't know you could prompt for one letter without pressing enter like that :)
  • cutrightjm
    cutrightjm over 8 years
    If you have a "don't know" case, is there any way to go back to the "Do that?" prompt again?
  • user unknown
    user unknown over 8 years
    @ekaj: Not as an option for read or case. You might surround it with a loop or put it in a function and call that function recursively, to enforce a matching answer.
  • JaKXz
    JaKXz over 8 years
    [This is very late but] technically, you've indicated that Y is the default option, but your logic will actually "not do that" if the input is anything other than Y or y. To make your echo clearer, your should say "Do that? [y/N]" or your if statement should change to check for the n/N characters. +1 because your answer is simpler! :)
  • user unknown
    user unknown almost 2 years
    @cutrightjm: Another alternative is using the select keyword, but then you select by number and get prompted for a valid input, but then you have to press ENTER to terminate your input.