Bash присваивает переменную результат функции bool, затем проверяет

Вы можете автоматизировать это с помощью подстановки, в частности квалификатора e glob , плюс eval , но это не очень красиво и цитирование сложно:

eval paste *.csv(e\''REPLY="<(cut -d, -f1 $REPLY)"'\')
  • Часть между \ '… \' - это некоторый код, выполняемый для каждого совпадения глобуса. Он выполняется с переменной REPLY , установленной в соответствие, и может изменять ее.
  • Я заключил код в одинарные кавычки, чтобы он не раскрывался при синтаксическом анализе глобуса.
  • Код REPLY = " генерирует строку , если совпадение это file1.csv . Двойные кавычки необходимы для того, чтобы часть после знака равенства не расширялась при выполнении кода e , кроме подстановки значения REPLY .
  • Поскольку каждый глобальный файл заменяется строкой,

Было бы лучше скрыть сложность функции. Минимально проверено.

function map {
  emulate -LR zsh
  local cmd pre
  cmd=()
  while [[ $# -ne 0 && $1 != "--" ]]; do
    cmd+=($1)
    shift
  done
  if ((!$#)); then
    echo >&2 "Usage: $0: COMMAND [ARGS...] -- PREPROCESSOR [ARGS...] -- FILES..."
    return 125
  fi
  shift
  while [[ $# -ne 0 && $1 != "--" ]]; do
    pre+="${(q)1} "
    shift
  done
  if ((!$#)); then
    echo >&2 "Usage: $0: COMMAND [ARGS...] -- PREPROCESSOR [ARGS...] -- FILES..."
    return 125
  fi
  shift
  eval "${(@q)cmd}" "<($pre${(@q)^@})"
}

Пример использования (синтаксис напоминает zargs ):

map paste -- cut -d, -f1 -- *.csv

4
27.05.2018, 20:22
3 ответа

Confundes la salida con el código de salida.

_my_func() {
  if _has_string 'string'; then

También debe citar sus variables; y _has_stringse puede simplificar:

_has_string() {
    [ "$1" = 'string' ]
}
13
27.01.2020, 20:45

$(...) devuelve la salida del comando :las cosas enviadas a stdout. Quiere el código de salida . Después de que un proceso (o, en su caso, la función )finaliza en un script bash, la variable especial $?se establece en el código de salida.

Así que en lugar de

var=$(_has_string 'string')
...

considerar

_has_string 'string'
var=$?
...
6
27.01.2020, 20:45

Como otros ya señalaron, lo que necesita simplemente es usar la función dentro de la instrucción if. Aquí hay algo que quizás no sabías:

Una función puede tratarse como una forma de comando compuesto . Y según bash manual [[es uno de los operadores que se pueden utilizar en la construcción de un comando compuesto. Por lo tanto, su función _has_string()puede implementarse así:

$ _has_string()[[ "$1" = "string" ]]
$ if _has_string "string"; then echo "YES"; fi
YES

Por supuesto, esto no es portátil de ninguna manera, debido al operador [[. Pero podemos hacer uso de ( )o {}.Así es, por ejemplo, cómo funciona esto en/bin/dash:

$ _has_string()( [ "$1" = "string" ]; )
$ if _has_string "string"; then echo "YES"; fi
YES
$ if _has_string "nope" ; then echo "YES"; fi                             
$ 
0
27.01.2020, 20:45

Теги

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