Ascii两个字符串之间的区别

时间:2013-09-25 20:56:48

标签: string bash shell

有没有办法在shell脚本中找到两个字符串之间的Ascii差异。应该首先检查第一个字符,如果第一个字母相同,则应该检查第二个字符。就像C的strcmp函数一样。

strcmp返回第一个不匹配字符的ascii值的差值。即strcmp(“你好”,“世界”)是-15而strcmp(“你好”,“你好”)是32.希望你明白了。

6 个答案:

答案 0 :(得分:4)

你可以得到两个字符的ascii值之间的区别,如下所示:

(( $(printf %d \"$a) - $(printf %d \"$b)))

所以这应该有效:

strcmp() {
  local diff
  for ((i=0; i<=${#1}; ++i)); do
    if ((diff=$(printf %d \""${1:i:1}") - $(printf %d \""${2:i:1}") ));
      then echo $diff; return
    fi
  done
  echo 0
}

如果一个字符串是另一个字符串的前缀,则没有指定该值应该是什么;上面使用较短字符串的尾随NUL字符(0)来计算差异。

测试:

$ strcmp hello world
-15
$ strcmp hello Hello
32
$ strcmp abc def
-3
$ strcmp def abc
3
$ strcmp def dbc
3
$ strcmp def ddc
1
$ strcmp def dgc
-2
$ strcmp def dec
3
$ strcmp def de
102
$ strcmp de def
-102
$ strcmp def def
0
$ strcmp "a b c" "a bde"
-68
$ strcmp "a b c" "a b e"
-2

答案 1 :(得分:1)

使用test(此处在括号内调用)进行词法比较。

[ 'bar' '<' 'foo' ] # returns true
[ 'bar' '>' 'foo' ] # returns false
[ 'bar' = 'foo' ] # returns false

你可以组合一个有点模仿C strcmp函数的小函数:

function strcmp {
    if [ $1 == $2 ]
    then
        return 0
    elif [ $1 '<' $2 ]
    then
        return 2
    fi
    return 1
}

strcmp foo bar
echo $?

请记住,没有负面的返回值,因此您必须选择不寻常的返回值或设置变量。

答案 2 :(得分:1)

在bash中(因为你标记了它):

$ cat tst.sh
function strcmp() {
    printf "%d\n" $(( $(printf "%d" "'${1:0:1}") - $(printf "%d" "'${2:0:1}")))
}

printf "strcmp(\"$1\",\"$2\") = %d\n" $(strcmp "$1" "$2")
$ ./tst.sh foo foo
strcmp("foo","foo") = 0
$ ./tst.sh foo bar
strcmp("foo","bar") = 4
$ ./tst.sh bar foo
strcmp("bar","foo") = -4

答案 3 :(得分:1)

以下功能完成工作,

  strcmp()
  {
    arg1=$1
    len=${#arg1}
    arg2=$2
    len1=${#arg2}
    len1=$(($len1+1))
    len=$(($len+1))
    i=0
    # echo $len - $len1

    while [ $i -le $len ] || [ $i -le $len1 ];
    do
       tem1=${arg1:$i:1}
       tem2=${arg2:$i:1}
       # echo $tem1-$tem2; 
       val1=`echo $tem1 | tr -d "\n" | od -An -t dC`     
       val2=`echo $tem2 | tr -d "\n" | od -An -t dC`
       res=$(($val1-$val2))
       if [ $res -lt 0 ] ; then
         # echo "Less $res"
          break
       elif [ $res -gt 0 ] ; then
          #echo "Greater $res"
           break
       # else 
         #     echo "Equal"
       fi
       i=$(($i+1))
        # echo "i=$i"
    done
    echo $res  
  }






 echo $(strcmp "Zefaop" "Zefat")

答案 4 :(得分:0)

Howabout

$ diff  <(echo "stackoverflow" ) <(echo "stackowerflow")
1c1
< stackoverflow
---
> stackowerflow

$ cmp -bl <(echo "stackoverflow") <(echo "stackowerflow")
                  7 166 v    167 w

或者,循环遍历字符串中的所有字符:

#!/bin/bash

foo=string
for (( i=0; i<${#foo}; i++ )); do
  echo ${foo:$i:1}
done

输出:

s
t
r
i
n
g

答案 5 :(得分:0)

有些讨厌的人说PHP只不过是C的包装,所以让我们用它:

$ difference=$(php -r "echo strcmp('foo', 'far');")
$ echo $difference
14

PHP安装在大多数系统上,或者可以轻松添加。没有定义strcmp的返回值必须是等于,小于或大于1的任何值 - 因此代码在没有进一步测试的情况下不被认为是可移植的(例如,当运行与其他编译的PHP时)编译器而不是gcc)。

相关问题