What if the string is a single line, and line and there is some difference between the two strings? @alpha_989 , here's your answer: $ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.") \n 1c1 \n < Here are the letters in String One.
The need to compare strings in a Bash script is relatively common and can be used to check for certain conditions before proceeding on to the next part of a script. A string can be any sequence of characters. To test if two strings are the same, both strings must contain the exact same characters and in the same order.
$1 means an input argument and -z means non-defined or empty. You're testing whether an input argument to the script was defined when running the script. Follow this answer to receive notifications.
Using diff
or com
or whatever you want:
diff <(echo "$string1" ) <(echo "$string2")
Greg's Bash FAQ: Process Substitution
or with a named pipe
mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p
Greg's Bash FAQ: Working with Named Pipes
Named pipe is also known as a FIFO.
The -
on its own is for standard input.
<<<
is a "here string".
&
is like ;
but puts it in the background
Reminds me of this question: How can you diff two pipelines in Bash?
If you are in a bash session, you could do a:
diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)
with <
creating anonymous named pipes -- managed by bash -- so they are created and destroyed automatically, unlike temporary files.
So if you manage to isolate your two different string as part of a command (grep, awk, sed, ...), you can do - for instance - something like:
diff < grep string1 myFile < grep string2 myFile
(if you suppose you have in your file lines like string1=very_complicated_value
and a string2=another_long_and_complicated_value'
: without knowing the internal format of your file, I can not recommend a precise command)
I prefer cmp
and Process Substitution feature of bash:
$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
2 142 b 161 q
5 141 a 145 e
Saying on position 2, a b occurs for the first, but a q for the second. At position 5, another difference is happening. Just replace those strings by variables, and you are done.
Say you have three strings
a="this is a line"
b="this is"
c="a line"
To remove prefix b from a
echo ${a#"$b"} # a line
To remove suffix c from a
echo ${a%"$c"} # this is
Another example:
before="184613 102050 83756 63054"
after="184613 102050 84192 83756 63054"
comm -23 <(tr ' ' $'\n' <<< $after | sort) <(tr ' ' $'\n' <<< $before | sort)
Outputs
84192
Original answer here
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With