Как сделать так, чтобы скрипт bash завершился на новой строке? - PullRequest
1 голос
/ 16 июня 2011

Это для учебных целей. Я написал скрипт, который будет имитировать набор текста.

Использование:

$ typewriter (insert some text here)

Тогда скрипт будет отображать его случайным образом, который выглядит так, как будто кто-то печатает. Хорошо, но проблема в том, что если вход содержит точку с запятой (;), он ломается.

Например:

$ typewriter hello; world

Я полагаю, это простое исправление. Я просто не могу понять это.

Заранее спасибо!

КОД:

#!/bin/bash
#Displays input as if someone were typing it

RANGE=4
the_input=$*
if [ x$* = "x" ] || [ x$* = "xusage" ] || [ x$* = "xhelp" ] || [ x$* = "x--help" ];
then
        echo "Usage: typewriter <some text that you want to look like it's typed>"
        exit 1

fi
  while [ -n "$the_input" ]
  do
    number=$RANDOM
    let "number %= RANGE"
    printf "%c" "$the_input"
    sleep .$number
    the_input=${the_input#?}
  done
  printf "\n"

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Не совсем: ; сигнализирует об окончании команды. У вас будет похожая проблема с каналами и перенаправлением ввода / вывода (|, <, >), символы, которые имеют значение.

Ваша единственная альтернатива - поставить аргумент в кавычки.

typewriter "some; text<>| that should be displayed"
2 голосов
/ 16 июня 2011

Вы также можете изменить свой скрипт для чтения со стандартного ввода:

the_input=`cat`

Команда cat назначит для ввода все входные данные от пользователя до тех пор, пока не наберется ^ D.

Преимущества в том, что пользователь может вводить более одной строки и пробел в пределах линии будут сохранены.

Аккуратный скрипт!

...