[CLUE-Tech] shell programming

Dave Price davep at kinaole.org
Wed Dec 11 03:26:36 MST 2002


On Wed, Dec 11, 2002 at 09:48:32AM -0100, Marcin wrote:
> 
> Hello,
> 
> I don't understand something.
> I've written something like this:
> 
> #! /bin/bash
> if [ $user="root" ]
> then
> 	echo "Hello root"
> else
> 	echo "You aren't a root"
> fi
> 
> I'm loged in as user e.g. Orion and if I run this script I get "Hello 
> root", but I'm not a root only user Orion.
> If I correct second line (add sign "!") :
> if [ ! $user="root" ] 
> then my script works OK and when I run it I get "You aren't a root"
> Why this script works OK only with the sign "!" ?
> But if I now do command "su root" and I became a root and run this 
> script as root it again doesn't work OK :-( I get "You aren't a root"
> Do someone know this and could explain me?
> How I should write this script?
> I use RH 7.3 and bash shell.
> 
Marcin,

(reaches for O'Reilly's bash book)

A couple of things ... $USER and $user are not the same - the
environment variable is case sensitive.

You need spaces between the $VAR, the condition, and the test value (see
below... also, (you had this right) - spaces around the []'s are required
too!

When you 'su' your $USER variable does not change, but your $UID
variable does.  (root's UID is 0 {zero})

Try running this version of your test case as a normal user, an su'd
user, and a shell initially logged in as root (you may need to ctrl-alt
f# out of X and log in as root to see the last case work... alt-f7
should get your X back, unless you have whacky video drivers like i used
to!!! -- If you are not running X, just switch to another virtual
console and login as root)

Try setting the lower-case $user and $uid with the bash built-in
'export' - see my sample.

<snippage>
#!/bin/bash
# utest -  Conditional test of $USER and $UID - dap 12.10.2002

# Extra debug .... let's view the variables 

echo "debug: $USER $UID"

# This will always be null, unless you export user or uid by hand
# Note: MS-DOS environment vars are upper case in reality, but not case
# sensitive in practice.

echo "case-sensitivity debug: $user $uid"

if [ $USER = root ] 

# Not the same as $USER=root or $user = root

   then
      echo "Hello (user) root"
   else
      echo "You aren't a (user) root"
fi
if [ $UID = 0 ]
   then
      echo "Hello (uid) root"
   else
      echo "You aren't a (uid) root"
fi
	
</snippage>

<sample>
[davep at ldpx:~/bin]$ utest
debug: davep 501
case debug:  
You aren't a (user) root
You aren't a (uid) root
[davep at ldpx:~/bin]$ export user=billgates
[davep at ldpx:~/bin]$ export uid=666
[davep at ldpx:~/bin]$ utest
debug: davep 501
case debug: billgates 666
You aren't a (user) root
You aren't a (uid) root

[davep at ldpx:~/bin]$ su

#  I am su'd to root here ...
[root at ldpx bin]# export user=foo
[root at ldpx bin]# export uid=bar    
[root at ldpx bin]# ./utest
debug: davep 0

# Note my new UID value

case debug: foo bar
You aren't a (user) root
Hello (uid) root
# Note that the lower-case vars could have been anything and do not
# impact the conditional tests
</sample>

Hope this helps!

aloha,
dave





More information about the clue-tech mailing list