"$outer"
é uma variável escalar entre aspas, de modo que sempre se expande para um argumento. Se vazio ou não definido, isso ainda se expande para um argumento vazio para join
(e quando você chama seu script com -o2
, esse é um argumento -a 2
em vez dos dois argumentos -a
e 2
).
O seu join
é provavelmente o GNU join
em que ele aceita opções após argumentos não-opcionais. Esse "$outer"
é um argumento não opcional quando vazio, pois não começa com -
, portanto, é tratado como um nome de arquivo e join
reclama sobre o terceiro nome de arquivo fornecido, o que não é esperado.
Se você quiser uma variável com um número variável de argumentos, use uma matriz:
outer=()
...
(o)
outer=(-a "$OPTARG");;
...
join "${outer[@]}"
Embora aqui você também possa fazer:
outer=
...
(o)
outer="-a$OPTARG";;
...
join ${outer:+"$outer"} ... <(sort < "$f1") <(sort < "$f2")
Ou:
unset -v outer
...
(o)
outer="$OPTARG";;
...
join ${outer+-a "$outer"} ...
(esse não funciona em zsh
, exceto na emulação sh / ksh).
Algumas outras notas:
-
join -t '\t'
não funciona. Você precisaria dedelim=$'\t'
para armazenar uma TAB literal em$delim
- Lembre-se de usar
--
ao passar argumentos arbitrários para comandos (ou usar redirecionamentos sempre que possível). Entãosort -- "$f1"
ou melhorsort < "$f1"
em vez desort "$f1"
.
As expansões aritméticas - também estão sujeitas a split + glob, portanto, também devem ser citadas (
shift "$((OPTIND - 1))"
) (mas isso não é um problema, pois você está usandobash
que não herda$IFS
do ambiente e você ' não está modificandoIFS
antes no script, mas ainda é uma boa prática).