LINUX.ORG.RU

Вопрос по Bourne Shell

 , ,


0

1

В учебнике А.В. Столярова «Азы программирования» в главе 2.13.2 приводится пример небольшого теста, написанного на языке Bourne Shell, который должен помочь в тестировании написанных программ.

У меня это свой вариант процедуры str на Pascal, которая переводит число в строковое представление и при вводе str(321.53459:15:9, s) занесет в переменную s строку " 321.534590000" длиной 15 символов с 9-ю символами после запятой и 2-мя пробелами вначале.

Я переписал под себя тестовую программу:

#1/bin/sh
#               RealToStringEdit_Test.sh

while read a b c d ; do
    res=`echo $a $b $c | ./RealToStringEdit`
    if [ x"$d" != x"$res" ]; then
        echo TEST $a $b $c FAILED: expected "$d", got "$res"
    else
        echo CONGRATULATIONS!
    fi
done <<END
321.53459 15 9 '  321.534590000'
END

Вопрос - как занести в переменную $d строку с пробелами в начале, как в моем случае? У меня строка заносится с кавычками, а мне нужно без.

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

для чего ставятся x перед переменными в условии

Чтобы обойти несовершенство [ и не допустить сравнение с пустотой в случае если одна из переменных окажется пустой, в качестве альтернативы можно воспользоваться [[

slowpony ★★★★★
()
Ответ на: комментарий от slowpony

Ты всё неправильно объяснил. Такая логика была в DOS в .bat файлах. А в UNIX шеллах пустая строка вполне себе строка, если кавычки не забывать.

#!/bin/sh -e

A=

if [ "" = "$A" ]; then
  echo '"" = "$A"'
fi

if [ "a" = "$A" ]; then
  echo '"a" = "$A"'
fi

if [ "" = "a$A" ]; then
  echo '"" = "a$A"'
fi

if [ "a" = "a$A" ]; then
  echo '"a" = "a$A"'
fi
firkax ★★★★★
()

процедуры str на Pascal, которая переводит число в строковое представление и при вводе str(321.53459:15:9, s) занесет в переменную s строку " 321.534590000" длиной 15 символов с 9-ю символами после запятой и 2-мя пробелами вначале.

Хороший тамада и конкурсы интересные

aedeph_ ★★
()

Вопрос - как занести в переменную $d строку с пробелами в начале, как в моем случае?

Экранирование: когда вводишь текст с клавиатуры, перед каждым пробелом ставь символ \, тогда пробел не будет интерпретироваться, а будет обрабатываться как обычный символ типа буквы

$ cat script.sh 
#!/bin/sh

read a

echo "##$a##"

$ ./script.sh 
\ \ 123
##  123##

pihter ★★★★★
()
Последнее исправление: pihter (всего исправлений: 1)

#1/bin/sh

#!/bin/sh
 ^

Вопрос - как занести в переменную $d строку с пробелами в начале, как в моем случае? У меня строка заносится с кавычками, а мне нужно без.

Можно использовать другие разделители:

$ read a b c d <<<"1 2 3 '  4'"
$ echo "$d"
'  4'
$ IFS=: read a b c d <<<"1:2:3:  4"
$ echo "$d"
  4
$ 

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

Здесь это не нужно, поскольку есть кавычки. Если бы их не было, то это защита от нарушения синтаксиса команды [ в случае, если переменная содержит пустое значение или не определена.

Rootlexx ★★★★★
()
Ответ на: комментарий от Rootlexx

Здесь это не нужно

Немного не так. Это ТЕПЕРЬ не нужно. Но исторически такого специального хака: если три аргумента и второй = и !=, то не интерпретировать первый аргумент появилось исторически недавно и всё таки противоречиво.

$ var="!"
$ [ "$var" = "!" ]
test: argument expected            (UNIX v7, 1979)
test: =: unary operator expected   (bash 1.14, 1996)
(false)                            (pd-ksh88, 1988)
$ [ "x$var" = "x!" ]
(true)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)