Sponsored Content
Full Discussion: Compare 2 Strings
Top Forums Shell Programming and Scripting Compare 2 Strings Post 302976889 by Don Cragun on Thursday 7th of July 2016 03:50:21 PM
Old 07-07-2016
First note that unlike C functions, shell functions can't return negative values. (The exit code from a shell function is a value in the range 0 through 255, inclusive.) Looking at your original script, it uses only two return values: 0 and 77. However, I don't know what the calls to fail do in your script. If they exit, that would exit the shell script that calls your function instead of just returning an error code for your function.

The following replacement for your function assumes that fail is a function that prints a diagnostic message and returns to the caller. (So after calling fail, this version of your function returns a non-zero exit status indicating that the checkversion() function was not able to successfully compare to version strings.) If this version of checkversion() does successfully compare two version strings it returns 0 and sets the variable checkversion_result to an integral value that is zero if the versions are the same, a value greater than zero if the version found in the symbolic link identified by the 1st operand is greater than the version passed in as the 2nd operand, or a value less than zero if the version found in the symlink is less than the version given as the 2nd operand.

All of the command substitutions using cut to find various subfields have been replaced by parameter substitutions (so this should be considerably faster). Debugging printf statements have been added so you can see each test being performed and the values used to determine the final result that is returned. (If the code is giving you values that are appropriate for what you're trying to do, you can remove all of the printf statements that start at the left margin. Note that I am not at all sure that I have the results correct in one, and only one, of the version strings contains RC_.)

This should all work with any shell that performs the parameter expansions required by the POSIX standards. (It has been tested with bash and ksh.) Like your script, it will only work on a system that includes a readlink utility. (The readlink utility is provided by many systems, but is not required by the POSIX standards.)

Code:
checkversion_result=

checkversion() {
	checkversion_result=
	local mod="$1"
	local vers="$2"
	local slink="/app/mes_dwh/$mod/${mod}"
	local target=$(readlink "$slink")
	target=${target#*V}
	target=V${target%%V*}

	case "$target" in
        (V_[0-9]_[0-9]_[0-9]_RC_b* | V_[0-9]_[0-9]_[0-9]_b*)
		;;
        (*)	fail "bad version string: '$target'"
		return 1
		;;
	esac
	case "${target##*b}" in
        (*[!0-9]*)
        	fail "bad build number: '$target'"
		return 2
		;;
	esac
  
	#compare major version
	local old=${target#*_}
	old=${old%%_*}
	local new=${vers#*_}
	new=${new%%_*}
	checkversion_result=$((old - new))
printf 'major old:%s new:%s result:%s\n' "$old" "$new" "$checkversion_result"
	[ "$checkversion_result" -ne 0 ] && return 0
	#compare middle version
	old=${target#*_*_}
	old=${old%%_*}
	new=${vers#*_*_}
	new=${new%%_*}
	checkversion_result=$((old - new))
printf 'middle old:%s new:%s result:%s\n' "$old" "$new" "$checkversion_result"
	[ "$checkversion_result" -ne 0 ] && return 0
	#compare minor version
	old=${target#*_*_*_}
	old=${old%%_*}
	new=${vers#*_*_*_}
	new=${new%%_*}
	checkversion_result=$((old - new))
printf 'minor old:%s new:%s result:%s\n' "$old" "$new" "$checkversion_result"
	[ "$checkversion_result" -ne 0 ] && return 0
	#ocmpare RC_b versus b
	old=${target#*_*_*_*_}
	old=${old%%b*}
	new=${vers#*_*_*_*_}
	new=${new%%b*}
	if [ "$old" != "$new" ]
	then	[ "$old" = "" ] && checkversion_result=1 || \
				   checkversion_result=-1
	fi
printf 'RC old:%s new:%s result:%s\n' "$old" "$new" "$checkversion_result"
	[ "$checkversion_result" -ne 0 ] && return 0
	#compare build version
	old=${target##*b}
	new=${vers##*b}
	checkversion_result=$((old - new))
printf 'build old:%s new:%s result:%s\n' "$old" "$new" "$checkversion_result"
	return 0
}

The way to use this function would be something like:
Code:
if checkversion mod version
then	echo "version check completed successfully, result: $checkversion_result"
else	echo "version check failed; see diagnostics above"
fi

 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

to compare two strings

hi all, i am new to unix. Actually i need to compare two string and print the result... suppose type='sun' if; then echo good morning else echo good night fi whether the comparison is right r we need to use eq???? help me please.... :confused: thanks in advance.... (1 Reply)
Discussion started by: ithirak17
1 Replies

2. Shell Programming and Scripting

How to compare two strings

Hi all, I am trying to compare two strings/dates, but its throwing error::Syntax error at line 5: Please help !! Any alternate way to compare two dates is also fine.... logdate1=`date -u '+%Y.%m.%d %T'` sleep 5 logdate2=`date -u '+%Y.%m.%d %T'` if test... (5 Replies)
Discussion started by: prashant43
5 Replies

3. Shell Programming and Scripting

How to compare two strings using if

Hi, Here is my script #!/bin/ksh echo $pick_typ if ];then echo "inside if" else echo "outside if" fi when ever i pass CUS as parameter to this script am getting the correct value CUS, however if i pass ORD as parameter it is not coming inside if it is echoing else "Outside... (12 Replies)
Discussion started by: bhargav20
12 Replies

4. Shell Programming and Scripting

Compare text strings.

Hi Im trying to write a script that compare a text string. But it fails, I think it adds a extra line feed to the result and fails beacuse of that. The script. DT=`date +'%Y%m%d%H%M%S'` #ALARM_BIN=/users/alarms/ssa/alarms/bin QUEUE_THR=10 #unset offset #offset="***Server reports data... (3 Replies)
Discussion started by: vettec3
3 Replies

5. Shell Programming and Scripting

How to Compare 2 Strings ?

Hello , I want to Compare with 2 strings and get if they are True or not please would like some help on this #!bin/ksh echo "Enter Name 1" read Name1 echo "Enter Name 2" read Name2 echo "------------------------" echo "First Name: $Name1" echo "Second Name: $Name2" echo... (25 Replies)
Discussion started by: shatztal
25 Replies

6. Shell Programming and Scripting

Compare two strings

hi.. i have a problem to compare two string my code is like that if ] then echo "both data are correct" elif ] echo "data is wrong" fi here $username1 is taking value from file.. (7 Replies)
Discussion started by: shubhig15
7 Replies

7. Shell Programming and Scripting

How to compare two strings in a file

hello guyzz please help me out.. I have two file a.sh and b.sh it contains two string SD109 ,SD108 . I want to compaere these two string . If a.sh>b.sh do rebasing record time. else it shows no rebasing required. Thanks. (2 Replies)
Discussion started by: abhijtr
2 Replies

8. Shell Programming and Scripting

Compare strings with space in if statement

DEV> vi test_if_statement.sh "test_if_statement.sh" 9 lines, 205 characters proc_out="Normal completion" proc_out_comp="Normal completion" echo 'proc_out:'$proc_out echo 'proc_out_comp:'$proc_out_comp if then echo 'match' else echo 'no_match' fi ~ ~ ~ ~ ~ ~ ~ ~ ~ (4 Replies)
Discussion started by: cartrider
4 Replies

9. UNIX for Beginners Questions & Answers

If statement to compare two strings

Hi, I am trying to do the following to see if "ip" is already present in a file. if ; then echo "hi" else echo "hello" fi I am seeing errors on the if statement. Can someone please correct the syntax for me? Thanks (2 Replies)
Discussion started by: waince
2 Replies

10. Ubuntu

Compare 2 strings

I think there is a way to detect mouse movement. valuator changes if the mouse moves. So I need to compare the two strings. Not sure how to do that. How could I send the valuator string to a file ? I would need to do it twice. andy@7_~/Downloads$ xinput query-state 9 2 classes :... (7 Replies)
Discussion started by: drew77
7 Replies
All times are GMT -4. The time now is 02:15 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy