Differences between revisions 2 and 4 (spanning 2 versions)
Revision 2 as of 2008-04-30 10:12:50
Size: 808
Editor: Lhunath
Comment: Improved examples and some more explanation.
Revision 4 as of 2008-04-30 13:32:04
Size: 1500
Editor: GreyCat
Comment: fancy counter thingy, because someone will want one
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:
read -sp "Press [enter] to continue..." # Bash
read -p "Press [enter] to continue..."

# Bourne
echo "Press [enter] to continue..."
read junk
Line 11: Line 16:
# Bash
Line 16: Line 22:
# Bash
Line 17: Line 24:
if ! read -sn 1 -t 5 -p "Will resume in 5 seconds. Press any key to abort..." echo -n "Press a key within 5 seconds to cancel."
if ! read -sn 1 -t 5
Line 22: Line 30:
For those of you who just want to pause for a while, regardless of the user's input, use `sleep`: If you just want to pause for a while, regardless of the user's input, use `sleep`:
Line 27: Line 35:

If you want a fancy countdown on your timed `read`:
{{{
# Bash
# This function won't handle multi-digit counts.
countdown() {
  local i
  echo -n $1
  sleep 1
  for ((i=$1-1; i>=1; i--)); do
    printf "\b%d" $i
    sleep 1
  done
}

echo 'Warning!!'
echo -n 'Five seconds to cancel: '
countdown 5 & pid=$!
if ! read -s -n 1 -t 5; then
  echo; echo "boom"
else
  kill $pid; echo; echo "phew"
fi
}}}
(If you test that code in an interactive shell, you'll get "chatter" from the job control system when the child process is created, and when it's killed. But in a script, there won't be any such noise.)

Anchor(faq65)

Is there a "PAUSE" command in bash like there is in MSDOS batch scripts? To prompt the user to press any key to continue?

Use the following to wait until the user presses enter:

# Bash
read -p "Press [enter] to continue..."

# Bourne
echo "Press [enter] to continue..."
read junk

Or use the following to wait until the user presses any key to continue:

# Bash
read -sn 1 -p "Press any key to continue..."

If you want to put a timeout on that, use the -t option to read:

# Bash
echo "WARNING: You are about to do something stupid."
echo -n "Press a key within 5 seconds to cancel."
if ! read -sn 1 -t 5
then something_stupid
fi

If you just want to pause for a while, regardless of the user's input, use sleep:

echo "The script is tired.  Please wait a minute."
sleep 60

If you want a fancy countdown on your timed read:

# Bash
# This function won't handle multi-digit counts.
countdown() {
  local i 
  echo -n $1
  sleep 1
  for ((i=$1-1; i>=1; i--)); do
    printf "\b%d" $i
    sleep 1
  done
}

echo 'Warning!!'
echo -n 'Five seconds to cancel: '
countdown 5 & pid=$!
if ! read -s -n 1 -t 5; then
  echo; echo "boom"
else
  kill $pid; echo; echo "phew"
fi

(If you test that code in an interactive shell, you'll get "chatter" from the job control system when the child process is created, and when it's killed. But in a script, there won't be any such noise.)

BashFAQ/065 (last edited 2013-04-08 12:28:58 by geirha)