Вы можете автоматизировать это с помощью подстановки, в частности квалификатора 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
Confundes la salida con el código de salida.
_my_func() {
if _has_string 'string'; then
También debe citar sus variables; y _has_string
se puede simplificar:
_has_string() {
[ "$1" = 'string' ]
}
$(...)
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=$?
...
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
$