• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 538
  • Last Modified:

C Shell Read Numeric value only

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
cclmotors
Asked:
cclmotors
1 Solution
 
avizitCommented:
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
 
avizitCommented:
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
 
avizitCommented:
and maybe you can change your if condition to

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


0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

 
cclmotorsAuthor Commented:
Thank you.

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

When the 3rd char is not numeric value, it always accept.
0
 
avizitCommented:
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
 
yuzhCommented:
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
 
cjjcliffordCommented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now