LINUX.ORG.RU

man POSIX-compliant

anonymous
()
Ответ на: комментарий от Spoofing

указывай в скриптах #!/bin/sh, все остальное не нужно.

отличный пример упоротого фанатика itt

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

указывай в скриптах #!/bin/sh
[[ ]]

Если ты предлагаешь использоваться башизмы в скриптах где указано #!/bin/sh - то это эталонная фигня

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

$ help test

сравнение строк делается [ «blah» -eq «blah» ]. единственная киллер-фича [[ ]] это регексы (регулярные выражения).

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

Мало, что понял на данный момент (запутался), но буду отталкиваться от того, что есть! Спасибо!

djemNa
() автор топика

Забудь этот язык как страшный сон, как только сдашь зачёт. Он уродует человеку мозги. По теме: опытным путём установлено, что надо использовать использовать конструкцию [[ -z «$var» ]] && echo «la-la»

Работает и в ksh, и в новомодном bash;

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

в новомодном bash

остро, по-олдскульному

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

Забудь этот язык как страшный сон, как только сдашь зачёт.

Шелл офигенен и прост до неприличия.

Он уродует человеку мозги

Пфф... Ты на питонистов и пехапешников посмотри.

Тсу, не мучай баш - возьми лучше busybox. Он почти чистый POSIX без собственной несовместимой шелухи.

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

rain@elitebook:~$ [ 'blabla' =~ 'la' ] && echo 1
bash: [: =~: ожидается использование бинарного оператора
rain@elitebook:~$ [[ 'blabla' =~ 'la' ]] && echo 1
1

«la» входит в «blabla»

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

Шелл офигенен и прост до неприличия.

На нём сложный эскейпинг. Сложно реализовать сериализацию/десериализацию.

x3al ★★★★★
()

Ну, во-первых, [ — это алиас встроенной команды test. У них одинаковые ограничения. [[ — более продвинутая версия.

[ использует для проверки строк на совпадение операторы = и !=.
[[ использует ==, != и =~, при этом правый аргумент расценивается как регулярное выражение, а не как строка, если не взят в кавычки.

a="abcdef"; b="abc"; [ "$a" = "$b" ] && echo '1 matches!'; [[ "$a" == "$b"* ]] && echo '2 matches!'
Собственно, поэтому аргументы, указанные в [[ не подвергаются pathname expansion, то есть
[[ "$a" == "$b"* ]]
будет всегда расцениваться, как «начинается ли то, что лежит в $a с $b?», в то время как
[ "$a" = "$b"* ]
тоже верная конструкция, которая означает «раскрыть $b* до всех соответствующих имён в текущем каталоге и сравнить со строкой из $a». При этом если мы в пустом каталоге сделаем…
a='abcdef'
b='abc'
touch abcdef
[ "$a" = "$b"* ] && 'existed!'
то увидим «existed!», произошла проверка на имя файла. А если сразу после этого…
touch abcedf abcfed
[ "$a" = "$b"* ] && 'existed!'
то ответом будет
bash: [: too many arguments
Правый аргумент раскрылся во множество строк каждая с именем существующего файла, и это вызвало ошибку, потому что = ожидает только один аргумент после себя.

Операторы > и < в обоих командах сравнивают строки лексически, но [ сравнивает по ASCII, а [[ – используя локаль, которая может быть хоть С, хоть из UTF-8. Логические операторы просто называются по-разному, [ использует -a и -o, а [[ – && и || соответственно.

Использование [[ оправдано только там, где оно необходимо и необходимость эта обоснована.

man bash

Deleted
()
Ответ на: комментарий от Spoofing

сравнение строк делается [ «blah» -eq «blah» ]

Сравнение строк делается [ «blah» = «blah» ].
-eq для сравнения целых чисел.

akk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.