Linux 检查字符串是否为回文

Linux 检查字符串是否为回文,linux,bash,scripting,Linux,Bash,Scripting,我试图检查字符串是否是bash中的回文。以下是我的想法: #!/bin/bash read -p "Enter a string: " string if [[ $string|rev == $string ]]; then echo "Palindrome" fi 现在,echo$string | rev给出了反向字符串。我的逻辑是在if的条件下使用它。结果不太好 那么,如何将rev中的“返回值”存储到变量中呢?或者直接在条件下使用它?使用$(命令替换): 仅限bash的实现:

我试图检查字符串是否是bash中的回文。以下是我的想法:

#!/bin/bash
read -p "Enter a string: " string
if [[ $string|rev == $string ]]; then
    echo "Palindrome"
fi  
现在,
echo$string | rev
给出了反向字符串。我的逻辑是在
if
的条件下使用它。结果不太好

那么,如何将
rev
中的“返回值”存储到变量中呢?或者直接在条件下使用它?

使用
$(命令替换)


仅限bash的实现:

is_palindrome () { 
    local word=$1
    local len=$((${#word} - 1))
    local i
    for ((i=0; i <= (len/2); i++)); do
        [[ ${word:i:1} == ${word:len-i:1} ]] || return 1
    done
    return 0
}

for word in hello kayak; do
    if is_palindrome $word; then
        echo $word is a palindrome
    else
        echo $word is NOT a palindrome
    fi
done
是回文(){
本地字=$1
局部len=$(${word}-1))
本地i

对于((i=0;i另一个没有
echo
的变体,以及
[…]]
中不必要的引用):

#!/bin/bash
read -p "Enter a string: " string
if [[ $(rev <<< "$string") == "$string" ]]; then
    echo Palindrome
fi
!/bin/bash
阅读-p“输入字符串:”字符串

如果[[$(rev可能不是最好的实现,但是如果您需要纯sh

#!/bin/sh

#get character <str> <num_of_char>. Please, remember that indexing is from 1
get_character() {
  echo "$1" | cut -c "$2"
}

for i in $(seq $((${#1} / 2))); do
  if [ "$(get_character "$1" "$i")" != "$(get_character "$1" $((${#1} - i + 1)))" ]; then
    echo "NO"
    exit 0
  fi
done

echo "YES"

把它存储在一个变量中是
var=$($string | rev)
?如果你看看谷歌,你可以找到更多关于这个的信息…@Harry严肃地说,伙计?:D我试图避开古格诺教授,
var=$(echo“$string”| rev)
@LittleChild
var=$(echo“$string”| rev)
echo
在您的命令中的作用不是写出
$string | rev
的结果,而是将
$string
的值写入
rev
以便
rev
可以写出相反的版本。如何将其分配给变量?
var=$(rev Yes!(您可以自己运行并查看)考虑引用<代码>或更短的局部变量:<代码> ISH-PaldRoMeMe({本地W= 1);而[[$W=?*&*${0:1} =“${W::1 } ] ];W= $ {w:1:-1 };完成(;更短,但不一定更清晰。有人喜欢基准测试吗?它非常清晰,接近递归风格。你的风格更像是过程式风格。根据观点和背景,清晰性是主观的。是的,递归版本在Bash中很糟糕(因为Bash没有尾部递归优化)但我给出的那一个比你原来的(在我的机器上大约有20%)有更好的性能。
#!/bin/bash
read -p "Enter a string: " string
if [[ $(rev <<< "$string") == "$string" ]]; then
    echo Palindrome
fi
#!/bin/sh

#get character <str> <num_of_char>. Please, remember that indexing is from 1
get_character() {
  echo "$1" | cut -c "$2"
}

for i in $(seq $((${#1} / 2))); do
  if [ "$(get_character "$1" "$i")" != "$(get_character "$1" $((${#1} - i + 1)))" ]; then
    echo "NO"
    exit 0
  fi
done

echo "YES"
for i in $(seq 0 $((${#1} / 2 - 1))); do
  if [ "${1:$i:1}" != "${1:$((${#1} - i - 1)):1}" ]; then
    echo "NO"
    exit 0
  fi
done

echo "YES"