Bash: неправильная подстрока в цикле for

#bash #shell #unix #sh

#bash #оболочка #unix #sh

Вопрос:

Я пытаюсь написать скрипт, чтобы проверить, является ли строка палиндромом

 read str
l=${#str}-1
isPal=1

for((i=0;i<=l/2;i  ))
do
    echo "${str:$i,1} :: ${str:$((l-i)),1}"          
    if [[ ${str:$i,1} -ne ${str:$((l-i)),1} ]]; then
            isPal=0
    fi
done

if [[ $isPal -eq 1 ]]; then
        echo "YES"
else
        echo "NO"
fi
  

для входной строки: abcdefghi

вывод:

 cdefghi :: bcdefghi
cdefghi :: bcdefghi
cdefghi :: bcdefghi
cdefghi :: bcdefghi
cdefghi :: bcdefghi
YES
  

Я не могу понять, что происходит с подстрокой. Я ожидаю, что он вернет мне i-й символ и (l-i)-й символ соответственно

Ответ №1:

У вас есть как минимум пара ошибок:

  1. l=${#str} даст вам строковый результат, подобный 5-1 , not 4 . Использовать l=$((${#str} - 1)) .

  2. В арифметическом контексте x,y вычисляет x , игнорирует результат и расширяется до вычисления y . Вместо ${str:$i,1} , используйте ${str:i:1} . ${str:l-i:1} достаточно, поскольку l-i уже оценивается в арифметическом контексте.

Ответ №2:

Проблема в том, что вы используете , вместо : того, чтобы разделять подстроку.

И -ne вместо != того, чтобы сравнивать.

Итак, этот код будет работать:

 if [[ ${str:$i:1} != ${str:$((l-i)):1} ]]; then
  

Тест 1:

 abcdefghi
a :: i
b :: h
c :: g
d :: f
e :: e
NO
  

Тест 2:

 abcdedcba
a :: a
b :: b
c :: c
d :: d
e :: e
YES