Ошибка при выполнении приглашения на чтение в csh и преобразовании в многострочный псевдоним

Привет всем, у меня есть эта проблема, где у меня есть пример программы на csh (я знаю, что это не лучший язык для использования в сценариях, но у меня нет выбора здесь), как это:

#!/bin/csh    
echo 'please enter values' 
read a 
read -e b
echo "My values are $a and $b" 

Как вы могли заметить, мое второе чтение займет файл ввода. Это необходимо, поскольку моя настоящая программа будет иметь это; Теперь, что я хочу сделать, это преобразовать это в псевдоним, однако, когда я выполняю приведенный выше скрипт, я получаю следующие. выход

please enter values
read: Command not found
read: Command not found
a: Undefined variable

Как я могу это исправить, а также я хочу преобразовать все эти 4 строки в многострочный псевдоним. В прошлом я написал однострочный псевдоним без проблем, но не уверен насчет многострочного. если кто-то может помочь, я буду очень благодарен

1 ответ

Решение

Как вы обнаружили, оболочка C не имеет встроенного read функция похожа на функцию снарядов типа Борна.

Я не опытный в csh Synatax, но, насколько я знаю, ближайший эквивалент заключается в использовании специальной переменной $<, От man csh:

       $<      Substitutes a line from the standard input, with no further
               interpretation.  It can be used to read from the keyboard
               in a shell script.

например

$ cat myscript.csh
#!/bin/csh

echo 'please enter values'
set a = $<
set b = $<
echo "My values are $a and $b"

который дает

$ ./myscript.csh
please enter values
123
abc
My values are 123 and abc

Обратите внимание, что существуют различия, зависящие от реализации, в том, как $< обрабатывает ввод нескольких слов - в частности, Tenex tcsh не заключает в кавычки ввод по умолчанию, вместо этого требуется $<:q чтобы получить то же поведение, что и BSD csh, Также, насколько я знаю, нет встроенной поддержки редактирования readline, эквивалентной оболочке bash. read -e,

Что касается многострочных псевдонимов, они, похоже, работают:

% alias jo '\
echo "please enter values "\
set a = $< \
set b = $< \
echo "My values are $a and $b"'
%
% alias
jo
echo "please enter values "
set a = $<
set b = $<
echo "My values are $a and $b"

Тестирование это

% jo
% please enter values
123
foo bar
My values are 123 and foo bar
%

однако это не та функция, на которую я бы рекомендовал опираться.

Другие вопросы по тегам