#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:
У вас есть как минимум пара ошибок:
-
l=${#str}
даст вам строковый результат, подобный5-1
, not4
. Использоватьl=$((${#str} - 1))
. -
В арифметическом контексте
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