Цикл while, использующий счетчик, использующий ввод целого числа пользователем

Вот еще один способ использования одного лайнера Perl...

$ perl -i -ne 's/^(\d{2})\.(\d{2})\.(\d{4})/$3-$2-$1/; print' in.txt
$ cat in.txt    
2015-07-15 12:24:47; +107.117 ; +106.925 ; +17.179 ; +102.099 ; +16.151

-121--209532-

Чтобы переназначать команду в vim :

:command  

В вашем случае:

:command X x

Но не делайте этого.

: X уже является командой в vim , она запрашивает ключ шифрования.

Если вы считаете, что трудно правильно ввести : x , используйте другой ярлык, ZZ .

2
15.05.2018, 20:40
3 ответа

Desea leer un número entero y luego hacer un bucle desde 1 hasta ese número entero, imprimiendo el número en cada iteración:

#!/bin/bash

read -p 'number please: ' num

for (( i = 1; i <= num; ++i )); do
    printf 'counter is at %d\n' "$i"
done 

Observe cómo el $no se usa al leer el valor. Con $varobtienes el valor de la variable var, pero readnecesita saber el nombre de la variable para leer, no su valor.

o, con un bucle while,

#!/bin/bash

read -p 'number please: ' num

i=0
while (( ++i <= num )); do
    printf 'counter is at %d\n' "$i"
done

El ((... ))en bashes un contexto aritmético. En tal contexto, no necesita poner $en sus variables, y los valores de las variables se interpretarán como números enteros.

o, con /bin/sh,

#!/bin/sh

printf 'number please: ' >&2
read num

i=1
while [ "$i" -le "$num" ]; do
    printf 'counter is at %d\n' "$i"
    i=$(( i + 1 ))
done

La prueba-le("menor o igual" )debe actuar sobre dos citadas expansiones variables (en este código ). Si no estuvieran entre comillas, como en [ $i -le $num ], entonces, si cualquiera de las variables contuviera un carácter global o un espacio, podría obtener resultados inesperados o errores. Además, las comillas protegen los números en caso de que la variable IFScontenga dígitos.

Preguntas relacionadas:

6
27.01.2020, 21:49

Para abordar la pregunta específica:

Do I need to convert the string to an int some how?

La respuesta es no. Las variables de shell son todas cadenas, pero según el contexto en el que se utilicen, pueden tratarse como enteros o cadenas. En el caso del operador -lepara el comando [(, también conocido como comando test), las variables se tratarán como números enteros.

# integer comparison
$ var=25; test "$var" -le "$HOME"
bash: test: /home/username: integer expression expected
$ test "$var" -le 30 && echo Lower
Lower
# string comparison
$ test $var = 24 && echo 'same string' || echo 'different string'
different string
$ test $var = 25 && echo 'same string' || echo 'different string'
same string

Su secuencia de comandos debe inicializar la variable counter, eliminar $de numOfBytesen ready eliminar $de let.

#!/bin/bash

read -p "How many bytes would you like you replace :> " numOfBytes
echo "$numOfBytes bytes to replace"
counter=0
while [ "$counter" -le "$numOfBytes" ]
do
    echo "testing counter value = $counter"
    let counter++
done

Esto funciona así:

$./counter.sh 
How many bytes would you like you replace :> 5
5 bytes to replace
testing counter value = 0
testing counter value = 1
testing counter value = 2
testing counter value = 3
testing counter value = 4
testing counter value = 5

Tenga en cuenta que debido a que letes una palabra clave bash/ ksh, esto hace que el script sea menos portátil. Sería recomendable hacer uso de la expansión aritmética counter=$((counter+1)), que es parte del estándar Shell Language de POSIX(sección 2.6.4 ).

Véase también:https://askubuntu.com/a/939299/295286


Como señaló Storm Dragon , el hecho de que las variables de shell se traten según su contexto también implica que la entrada del usuario debe limpiarse. Una forma posible es tomar numOfBytesen estado portátil casecomo en esta respuesta , que se encarga de determinar si la entrada es realmente un dígito.

3
27.01.2020, 21:49

Bash realmente no tiene tipos asignables. La variable es el tipo de su declaración. Entonces, si declara una variable como abc, es una cadena. Si lo declara como 138, es un int. Bash realmente no maneja decimales, por lo que si declara la variable como 138.0, la trata como una cadena.

Entonces, debe tener cuidado con la entrada del usuario, porque no puede pasar de 0a abc. Aquí hay un ejemplo que debería dar alguna verificación de error e incrementar a través de los bytes en un bucle.

#!/bin/bash

# Handle non-numeric input
read -p "How many bytes would you like you replace :> " numOfBytes
while [[ ! "$numOfBytes" =~ ^[0-9]+$ ]]; do
    echo
    echo "Please enter whole numbers only:"
    read -p "How many bytes would you like you replace :> " numOfBytes
done

echo "$numOfBytes bytes to replace $numOfBytes"
for i  in $(seq $numOfBytes) ; do
    echo "i has been incremented to $i."
done
exit 0
3
27.01.2020, 21:49

Теги

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