Writing my script and I'm banging my head on the desk right now ...
My biggest problem is the 3rd IF statement where I check if the username exists. Doing the grep command on it's own in the shell gives me a 1 or 0 value. Running the script, it always returns a false value (runs the ELSE statement) and if I change the IF to != 0 I always get a true value. Help?
'grep -c "$username" /etc/passwd' will never equal "1", because it's a string, containing the letters grep -c "$username" /etc/passwd". Single-quotes never run what's inside them.
Even if you did run it by putting it in backticks instead of single quotes, you'd still be doing it rather the long way around, making it count and checking its output string instead of just checking the return value grep and any other shell program gives you every time they finish. If grep succeeds, it'll trigger like 'true' in an if-statement, if it fails, it'll be like 'false'.
How about:
The "^" at the beginning of the string has a special meaning to grep, "must start at the beginning of the line". The : at the end just means :, so we know it matched the entire username part of "username:x:uid:gid:..." and not just part of it like "usernamezzz:x:uid:gid:..."
---------- Post updated at 05:05 PM ---------- Previous update was at 04:54 PM ----------
You also don't need to nest things 9 if-statements deep to check more than one thing in a row. Do that for more than 3 things and your code will become unreadable. If something's wrong, just quit early and spare yourself the mess.
You shouldn't depend on the $HOME variable. In some situations that's not even set. Try UID, that'll be 0 for root.
Corona688's grep -q solution is the best, but so you understand how things work I'll try and explain how one gets to it.
1. call grep, and throw away it's output and then examine return status:
Grep (and most unix commands) set exit status ($?) to zero on sucess (ie expresion matches), and non-zero for failure (expression not found or other errors, eg could not open file)
2. Grep supports a -q option (be quiet and just set exit status), so we can simplify to:
3. if runs command and executes block when command result is zero ( [ is just a shortcut for the test command). So we can use if to directly test the grep result:
This User Gave Thanks to Chubler_XL For This Post:
Oh I see, I didn't click that my statement was being read as a string and would always fail. Makes sense. Still new with all this.
2 more questions. Now my until loop exits when the user enters 'done'. I want it to exit when the user enter EOF (^D). Been looking around and can't seem to find the right way to do it. Tried putting it = ^D but that opened a can of worms.
Also, every time the search fails, what would be my best way to store all the failed accounts in a comma-separated list variable I could display at the end when the user exits the loop and script.
Hi All,
I am writing an if statement to check multiple conditions, but when I try to execute the script it is breaking at the point of if statement by showing the issue below.
Code I am using is given below.
if -a ]
then
....
else
...
fi
I am not understanding... (3 Replies)
echo "Enter the variable: " "
read var1
echo " "
for i in ib eb atm
do
if ; then
mv properties environment.properties
break
else
echo "No changes to $var1 "
fi
done
When i run and enter the eb it's not working.Any suggestions please.. (7 Replies)
Hi,
Here is a big head scratcher for me....
I'm creating a loop with while reading lines from a file called example.txt:
#!/bin/sh
while read line
do
some command > another file ----- output to another file
done < example.txt
I would like that another file to be unique for every... (5 Replies)
Could someone help me out with this if statement? It's supposed to get a person's website, but it isn't working when I run it.
website=""
echo "Would you like to enter a website? Enter Yes/No"
read choice
if
then
while
do
echo "Please enter a website:";
read... (4 Replies)
Hi I have a bash script like this
if
then
echo "A"
else
echo "B"
fi
$1 is something like 02350 (there is always a trailing '0')
and I would like to have an if based on the value of the digits after the 0.
Can anybody help?
Thanks,
Sarah (3 Replies)
The problem I am having here is that only the 1st option is executed, no matter if I pick yes or no. What am I doing wrong? How can I get this working right without resorting to a case statement?
echo "This is the max size your lvol can be:"
echo $MAXSIZE
echo
echo Do you want to max out... (2 Replies)
hi all. i just have a very small problem. i have a menu of 7 choices. i want an if statement so that if the user chooses anything except inside the 1 to 7 range, i can handle the error for it.
i tried this:
if ]
then
.......
fi
(but it dont work)
...any suggestions?
... (4 Replies)
I need an IF statement that will compare the contents of the variable CX with the actual string "CP". ie. If the contents of $CX are NOT equal to the actual string "CP" then blah blah blah.
I have tried a number of things including the following.......
if ]; then
if ]; then
if ];... (2 Replies)
I keep getting an error at line 21, it doesn't like my if statement. Previously I have tried using (( )), but still get errors. The current error is that server_busy is not found. This is the script:
#! /bin/ksh
server_busy="na"
for file in $1 $2 $3 $4 $5 $6
do
echo " ${file}\t\c"
... (1 Reply)