![]() |
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here. |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| How to get the exit status | yhacks | Shell Programming and Scripting | 1 | 05-19-2008 08:06 AM |
| Checking Exit Status | PrimeRibAndADew | Shell Programming and Scripting | 4 | 10-19-2005 03:01 PM |
| exit status | moxxx68 | Shell Programming and Scripting | 1 | 12-04-2004 07:27 PM |
| tar exit status | thorndike | UNIX for Dummies Questions & Answers | 3 | 01-22-2002 04:39 PM |
| ftp exit status. | oracle8 | UNIX for Advanced & Expert Users | 1 | 10-21-2001 11:34 PM |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Exit status
I'm preparing for exam and one of exams is to write own test command...
I wonder if in unix is a command which just returns exit code you specify.. I know I can easily write a function like this: Code:
exStatus() {
return $1
}
thank you! |
|
||||
|
I've got operations: -gt -lt == ( ) -z -n
I'm working on it and I'll post it here tomorrow (It's midnight here) I hope I'll finish the most important things Well, it doesn't have to be a complete replacement but the more the bette :-) It's a good for exercise... |
|
|||||
Quote:
Quote:
|
|
||||
|
> Do you have to do it without external commands?
I'm not sure what you exactly mean. I may use whatever command except test - I got the assignment this way. > I look forward to seeing it. I don't think you'll be pleased with great source code :-) >The standard test doesn't have a '==' operator. You're right it has just '=' operator. examples: ./test.sh 1 = 2 -a -z " " -o -n " " 2>/dev/null # I'm sending debugging info to stderr ./test.sh '(' 1 -lt 2 ')' -a '(' -z " " -o -n " " ')' 2>/dev/null Code:
#!/bin/sh
# File: test.sh
verbose=2; # TODO
# for debugging purposes; TODO - delete after finishing
if [ "$1" == "-x" ]; then
set -x;
shift 1
fi
expr2() { # expr without output
result=$( expr "$@" )
return $( expr $result "=" 0 )
}
usage() {
echo "Usage: "; # TODO
}
process() {
num_stack=0;
op_stack=0;
number1=0;
number2=0;
op="";
opened_with_logical_switch=$1;
deepness=$2
shift 2;
num_stack_in() { # number stack
num_stack=$(( $num_stack + 1 ));
echo "Deepness: $deepness; Num_stack: $num_stack; Value: $1" >&2
eval "number${num_stack}=$1"
if expr2 $num_stack ">" 2; then
echo "Error: Stack overflow";
exit 1;
elif expr2 $num_stack "=" 2; then
return 0;
else
return 1
fi
}
op_stack_in() { # operation stack
op_stack=$(( $op_stack + 1 ));
eval "op${op_stack}=\"$1\""
}
op_stack_out() {
eval "op=\$op${op_stack};"
op_stack=$(( $op_stack - 1 ));
}
do_op() {
op_stack_out;
case "$op" in
"="|">"|"<"|"!=") num_stack=0;
num_stack_in $(expr $number1 "$op" $number2);;
"-a") num_stack=0;
echo $number1 $number2 >&2;
if expr2 $number1 "=" 1 && expr2 $number2 "=" 1; then
num_stack_in 1;
else
num_stack_in 0;
fi;;
"-o") num_stack=0;
if expr2 $number1 "=" 1 || expr2 $number2 "=" 1; then
num_stack_in 1;
else
num_stack_in 0;
fi;;
*) echo "Unknown operation: "'`'"$op\""; exit 1;;
esac
}
while expr2 $# ">" "0"; do
switch="$1"
echo 'Deepness: '"$deepness"'; Switch: `'"$switch\"" >&2
shift
case "$switch" in
')') #if expr2 $opened_with_bracket "=" 0; then
# echo "$number1 "$(($# - 1)); # process ")" again
#else
echo "$number1 $#";
#fi
return 0;;
'(') partial_result=$(process 0 $(( $deepness + 1 )) "$@");
switch=$(echo "$partial_result" | cut -d" " -f 1);
remaining_switches=$(echo "$partial_result" | cut -d" " -f 2);
shift $(($# - $remaining_switches));; # shift after ")"
# test if $1 is empty
"-z") if expr2 "dd${1}dd" "=" "dddd"; then
switch=1;
else
switch=0;
fi
shift;;
"-n") if expr2 "dd${1}dd" "=" "dddd"; then
switch=0;
else
switch=1;
fi
shift;;
esac
case "$switch" in
"-a"|"-o") if expr2 $opened_with_logical_switch "=" 1; then
# $# + 1 because we want to process -a or -o again.
# (in this function the switch -a / -o are shifted)
echo "$number1 "$(($# + 1));
return 0;
fi
op_stack_in "$switch";
partial_result=$(process 1 $(( $deepness + 1 )) "$@");
if echo "$partial_result" | grep -q '^[10]\{1\}$'; then
switch=$partial_result;
remaining_switches=0;
else
switch=$(echo "$partial_result" | cut -d" " -f 1);
remaining_switches=$(echo "$partial_result" | cut -d" " -f 2);
fi
if num_stack_in $switch; then
do_op # with "$number1" "$number2"
fi
shift $(( $# - $remaining_switches ));;
[0-9]*) if num_stack_in "$switch"; then
do_op # with "$number1" "$number2"
fi;;
"=") op_stack_in "=";;
"!=") op_stack_in "!=";;
')') op_stack_in ')';;
'(') op_stack_in '(';;
'-gt') op_stack_in '>';;
'-lt') op_stack_in '<';;
*) echo 'Switch `'"$switch\" - not known"; exit 2;;
esac
done;
if expr2 $num_stack "=" 1 && expr2 $number1 "=" "1"; then
echo 1
return 0;
else
echo 0
return 1;
fi
}
# MAIN SCRIPT STARTS HERE
# =========================
if expr2 "$#" "=" "0"; then
usage;
else
process 0 "1" "$@" # verbose version
# process "1" "$@" >/dev/null # silent version
exit $?
fi
Enjoy :-) |
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|