Как передать оператор условия в качестве аргумента функциям в zsh?

Причина в конструкции XFS. Если вы углубитесь в ее историю, вы увидите, что SGI была известна своими рабочими станциями, предназначенными для редактирования аудио и видео. SGI создала XFS для очень хорошей обработки огромных файлов (xxx МБ и более ). Они добавили использование экстентов(с обычным размером около 1 МБ )для повышения производительности при обработке больших файлов. Вы можете найти более подробную информацию здесь

2
12.02.2021, 10:54
1 ответ

То, что вы сделали, не работает и в bash, за исключением очень простых примеров.

$ testif 'hello world = hello world'
bash: [: too many arguments
false
$ testif '"hello world" = "hello world"'
bash: [: too many arguments
false
$ testif '* = *'
(usually false with an error message, but it depends on the files in the current directory)

Даже ваш простой пример не работает в zsh, потому что в отличие от других sh -, таких как оболочки, в zsh $1на самом деле означает «взять значение первого аргумента» (почти :, если расширение приводит к пустому слову, оно полностью удаляется ). В bash и других sh -, подобных оболочкам, $1означает «взять значение первого аргумента, разбить его на слова и обработать каждое слово как шаблон глобуса», что почти никогда не является тем, что вам нужно.


В синтаксисе команды test/single -скобки можно передать условие как отдельные аргументы.

testif () {
  if [ "$@" ]; then echo true; else echo false; fi
}

Это работает (с ограничениями команды [, т.е. нет операторов &&и ||.

$ testif '*' = '*'
true
$ testif hello = hello
true
$ testif 'hello world' = 'hello world'
true
$ testif 0 = 00
false
$ testif 0 -eq 00
true

Тем не менее, редко бывает веская причина для [условия. Вы могли бы также передать всю команду. Это не только позволяет вам передавать другие виды условий (, например. grep …или if systemctl is-active …), но если вам нужно больше, чем простая команда, вы можете определить вспомогательную функцию.

testif () {
  if "$@"; then echo "true"; else echo "false"; fi
}
$ testif [ 'hello world' = 'hello world' ]
true
$ testif grep -q : /etc/passwd
true

Другой подход заключается в передаче всей команды в виде одной строки и использовании evalвнутри функции.

testif () {
  if eval "$1"; then echo true; else echo false; fi
}
$ testif '[ "hello world" = "hello world" ]'
true
$ testif '[ "hello world" = "h*" ]'
false
$ testif '[[ "hello world" = "h*" ]]'
false
$ testif '[[ "hello world" = h* ]]'
true
4
18.03.2021, 22:30

Теги

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