2014-11-04 33 views
2

我想检查一个字符串是否是bash中的回文。以下是我想出了:检查一个字符串是否为回文

#!/bin/bash 
read -p "Enter a string: " string 
if [[ $string|rev == $string ]]; then 
    echo "Palindrome" 
fi 

现在,echo $string|rev给出相反的字符串。我的逻辑是在if的条件下使用它。这并没有那么好。

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

回答

2

另一种变型,而不echo和不必要的内[[ ... ]]引述:

#!/bin/bash 
read -p "Enter a string: " string 
if [[ $(rev <<< $string) == "$string" ]]; then 
    echo Palindrome 
fi 
+0

以及如何将其分配给变量? 'var = $(rev <<< $ string)'? – 2014-11-04 20:50:11

+0

是的! (你可以运行并自己看看) – janos 2014-11-04 20:57:37

2

使用$(command substitution)

#!/bin/bash 
read -p "Enter a string: " string 
if [[ "$(echo "$string" | rev)" == "$string" ]]; then 
    echo "Palindrome" 
fi 
+0

并将其存储在变量中。将'VAR = $($串|转)'? – 2014-11-04 19:13:05

+1

你可以找到更多关于这个,如果你看看谷歌... http://phoxis.org/2010/01/26/bash-palindrome/ – Harry 2014-11-04 19:14:30

+0

@哈里认真,队友? :D我试图避免Google教授 – 2014-11-04 19:15:15

3

一个唯一的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 

通过gniourf_gniourf启发:

is_palindrome() { 
    ((${#1} <= 1)) && return 0 
    [[ ${1:0:1} != ${1: -1} ]] && return 1 
    is_palindrome ${1:1: 1} 
} 

我敢肯定,这确实递归调用的表现实在太烂。

+1

或更少的局部变量:'is_palindrome(){local w = $ 1; while [[$ w = ?? * && $ {w:0:1} =“$ {w:-1}”]];做w = $ {w:1:-1};完成; (($ {#瓦特} <2)); }'。 – 2014-11-04 21:22:37

+0

更短,但不一定更清晰。任何人都喜欢基准测试? – 2014-11-04 21:26:58

+0

它非常清楚,并且接近递归风格。你的更多是一种程序风格。根据观点和背景,清晰度是主观的。 – 2014-11-04 21:29:29

相关问题