Единственный способ выйти из цикла — $status
иметь значение success
. Это связано с тем, что результатом присваивания будет истинное значение в начале цикла, и цикл будет бесконечным.
Ваш цикл:
while [ some test ]; echo 'something'; retries=$(( $retries + 1 )); do
loop body
done
Вместо этого переместите echo
и присваивание в цикл:
#!/bin/bash
MAX_RETRIES=5
retries=0
status="$1"
while [ "$retries" -le "$MAX_RETRIES" ]; do
echo "$retries"
retries=$(( retries + 1 ))
sleep $(( 1^retries * 1))
if [[ "$status" == "success" ]]; then
echo "success"
break;
elif [[ "$status" == "pending" ]]; then
echo "pending"
else
echo "I am else."
fi
echo "Retries in do $retries"
done
echo "done."
Или, с case .. esac
:
#!/bin/bash
MAX_RETRIES=5
retries=0
status="$1"
while [ "$retries" -le "$MAX_RETRIES" ]; do
echo "$retries"
retries=$(( retries + 1 ))
sleep $(( 1^retries * 1))
case "$status" in
success)
echo "success"
break ;;
pending)
echo "pending" ;;
esac
echo "Retries in do $retries"
done
echo "done."
sed -e '/^line 2$/{r file1.txt' -e 'd;}' file2.txt
Скрипт sed
— это
/^line 2$/{
r file1.txt
d
}
Новая строка после имени файла file1.txt
является обязательной, поэтому разделение ее на отдельные -e
выражения в командной строке делает ее, возможно, более читабельной, чем
sed '/^line 2$/{r file1.txt
d;}' file2.txt
Сценарий ищет строку с содержимым line 2
. Когда это найдено, содержимое file1.txt
немедленно выводится, а исходная строка удаляется.
Использование sed -i
сделает изменения в строке -вfile2.txt
(нерекомендуемыми ).
Использование vi
Перейдите на линию, затем:
!!cat filename
Текущая строка заменена содержимым файла.