Como definir um parâmetro opcional? [fechadas]

4

Suponha que você tenha o seguinte problema:

Dependendo de se um script é executado em um canal ou não, você deseja anexar o parâmetro -print0 a find .

Posso pensar em pelo menos duas maneiras de fazer isso:

[[ -p '/dev/stdin' ]] && local null_terminated='-print0'
find -mindepth 1 -maxdepth 1 ! \( "${args[@]}" \) "$null_terminated"

Ou

    if [[ -p '/dev/stdin' ]]; then
        find -mindepth 1 -maxdepth 1 ! \( "${args[@]}" \) -print0
    else
        find -mindepth 1 -maxdepth 1 ! \( "${args[@]}" \)
    fi

Existe alguma maneira melhor de fazer isso? A questão é bash , mas soluções para outros shells ou soluções portáteis / padrão sh seriam bem-vindas também.

    
por helpermethod 14.03.2014 / 13:38

1 resposta

5

O primeiro não funcionará como se $null_terminated estivesse vazio ou não definido, find reclamará desse argumento extra vazio.

find -mindepth 1 -maxdepth 1 ! \( "${args[@]}" \) $null_terminated

Funcionaria, mas apenas se $null_terminated não contiver caracteres curinga ou caracteres do IFS.

Fazendo isso:

if [[ -p '/dev/stdin' ]]; then
  extra_args=(-print0)
else
  extra_args=()
fi

find -mindepth 1 -maxdepth 1 ! \( "${args[@]}" \) "${extra_args[@]}"

não teria o problema.

Bourne / POSIXly, você poderia fazer:

set -- find . ! -name . -prune ! \( "$@" \)
[ -p /dev/stdin ] && set -- "$@" -exec printf '%s
unset extra_arg; [ -p /dev/stdin ] && extra_arg=-print0
find . ! -name . -prune ! \( "$@" \) ${extra_arg+"$extra_arg"}
' {} + "$@"

Para um argumento:

find -mindepth 1 -maxdepth 1 ! \( "${args[@]}" \) $null_terminated

(note que -print0 não é POSIX).

    
por 14.03.2014 / 14:15

Tags