Solved

C Shell Read Numeric value only

Posted on 2004-08-31
8
520 Views
Last Modified: 2013-12-26
Hello,

I want to write a script on Digital UNIX C Shell to read user input but only numeric value. I have created a script to do that but it does not maintain 2 special characters: * and ?.

Do you know how to write it?
------------------------------------
#! /bin/csh -f
#
# On C Shell to read a value and ensure it belongs to numeric value.
#
echo -n "Enter a number: "
set ans = $<
if (($ans =~ [1-9]) || ($ans =~ [1-9]*[0-9]) && ($ans =~ [0-9])) then
  echo "Right " $ans
else
  echo "wrong"
endif
------------------------------------

Regards,

Paulus

0
Comment
Question by:cclmotors
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
8 Comments
 
LVL 11

Expert Comment

by:avizit
ID: 11948408
It is because the * etc is interpreted by the shell

following will give you an demo

#! /bin/csh -f
echo -n "Enter a number: "
set ans = $<
echo $ans

if you enter a '*'

the output echoed is the list of the files in the directories.

-----
the remedy ? ( i dont know yet :)
0
 
LVL 11

Expert Comment

by:avizit
ID: 11948428
use "set noglob" to disable metacharacters and after that metacharacters represent themselves.
be careful though if you have to use them

#! /bin/csh -f
#
# On C Shell to read a value and ensure it belongs to numeric value.
#
set noglob
echo -n "Enter a number: "
set ans = $<
if (($ans =~ [1-9]) || ($ans =~ [1-9]*[0-9]) && ($ans =~ [0-9])) then
  echo "Right " $ans
else
  echo "wrong"
endif
0
 
LVL 11

Expert Comment

by:avizit
ID: 11948477
and maybe you can change your if condition to

if (($ans =~ [0-9]) || ($ans =~ [1-9][0-9]*) )  then


0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:cclmotors
ID: 11948541
Thank you.

But it cannot maintain an input e.g. 12q

When the 3rd char is not numeric value, it always accept.
0
 
LVL 11

Expert Comment

by:avizit
ID: 11948608
the * is taken to be any charcater any number of times ..


one crude way would be to use something like

if ( ($ans =~ [0-9])  || ($ans =~ [1-9][0-9]) || ($ans =~ [1-9][0-9][0-9] ) ) then    

and so on depending on the acceptable length of the input
hardly a good solution ..
i am still looking into it though ..
0
 
LVL 38

Expert Comment

by:yuzh
ID: 11949681
Why use csh? Csh Programming Considered Harmful, see:
http://www-dbs.inf.ethz.ch/~fessler/csh-whynot.html

It is a lot easier to do it with sh/ksh/bash, eg:

expr $var + 0 >/dev/null 2>&1
if [ $? -ne 0 ] ; then
    echo "$var is not a number"
else
    echo "It is a number"
fi

0
 
LVL 11

Accepted Solution

by:
cjjclifford earned 250 total points
ID: 11950354
I agree, do not use CSH.

If you use KSH for scripting, you can also use "typeset" to restrict the type of a variable.

#!/usr/bin/ksh

read tempvar
# KSH script will exit (stating "bad number") if the value set here is not integer.
typeset -i var=$tempvar
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
Introduction: Dialogs (2) modeless dialog and a worker thread.  Handling data shared between threads.  Recursive functions. Continuing from the tenth article about sudoku.   Last article we worked with a modal dialog to help maintain informat…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Monitoring a network: how to monitor network services and why? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the philosophy behind service monitoring and why a handshake validation is critical in network monitoring. Software utilized …

729 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question