Как я могу добавить * в середине поля, созданного этим сценарием bash?

Ядро Linux 4.2

Минимальная программа тестирования

Затем мы можем протестировать ее с помощью минимальной 64-разрядной программы NASM:

global _start
_start:
    sub rsp, 0x7FF000
    mov [rsp], rax
    mov rax, 60
    mov rdi, 0
    syscall

Убедитесь, что вы отключили ASLR и удалили переменные среды, поскольку они попадут в стек и будут использоваться space:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
env -i ./main.out

Предел где-то немного ниже моего ulimit -s (8 МБ для меня).Похоже, это связано с тем, что дополнительные данные, указанные в System V, изначально помещаются в стек в дополнение к среде: Параметры командной строки Linux 64 в Assembly | Переполнение стека

Если вы серьезно относитесь к этому, TODO создаст минимальный образ initrd , который начинает запись сверху и спускается вниз, а затем запускает его с QEMU + GDB . Поместите dprintf в цикл, печатающий адрес стека, и точку останова на acct_stack_growth . Это будет великолепно.

По теме:

0
25.05.2018, 13:48
1 ответ

Cambia tu bucle más interno:

# tühikud
for((j = 2; j < $tarn;j++))
do
    echo -n "  "
done

a

# tühikud
for((j = 2; j < $tarn;j++))
do
    if [ "$i" -eq "$(( (rida+1) / 2 ))" ] && [ "$j" -eq "$(( (tarn+1) / 2 ))" ]; then
        echo -n '* '
    else
        echo -n "  "
    fi
done

Es decir, cuando detecte que está a punto de generar el -carácter central, inserte un *en lugar de un espacio.

Para una colocación un poco más precisa en la fila:

# tühikud
for((j = 2; j < $tarn;j++))
do
    if [ "$i" -eq "$(( (rida+1) / 2 ))" ] && [ "$j" -eq "$(( (tarn+1) / 2 ))" ]; then
        if [ "$(( tarn%2 ))" -eq 0 ]; then
            echo -n ' *'
        else
            echo -n '* '
        fi
    else
        echo -n "  "
    fi
done

En lugar de generar caracteres individuales, genere una fila completa a la vez. Esto es más eficiente y solo tiene que preocuparse por tres tipos de filas :filas superior/inferior, fila central y otras filas:

#!/bin/bash

read -r -p 'Height: ' rows
read -r -p 'Width : ' cols

topbottom=$( yes '*' | head -n "$cols" | tr '\n' ' ' )
printf -v midrow '*%*s*%*s*' "$(( cols - 2 ))" "" "$(( cols - 2 ))" ""
printf -v otherrows '*%*s*' "$(( 2*(cols - 2) + 1 ))" ""

for (( row = 0; row < rows; ++row )); do

    if (( row == 0 )) || (( row == rows - 1 )); then
        thisrow=$topbottom
    elif (( row == rows / 2 )); then
        thisrow=$midrow
    else
        thisrow=$otherrows
    fi

    printf '%2d %s\n' "$(( ++n ))" "$thisrow"
done
0
28.01.2020, 04:22

Теги

Похожие вопросы