#!/bin/sh
echo "Noise $1"
echo "Enhancement $2"
for snr in 0 5 10 15 20 25
do
python evaluate.py --noise $1 --snr 25 --iterations 1250 --enhancement $2
done
Se $2
não for especificado, não quero passar o --enhancement $2
argumento para meu script python. Como eu faria isso?
Modificando seu script original:
A expansão do parâmetro padrão
${var:+word}
será expandida paraword
se a variávelvar
estiver definida e não vazia. No código acima, usamos para adicionar--enhancement "$2"
ao comando se$2
estiver disponível e não vazio.Também tomei a liberdade de assumir que o que você está dando
--snr
como argumento de opção deve ser o valor da variável do loop.Meu toque pessoal no código (principalmente apenas usando
printf
em vez deecho
, evitando longas linhas e dando um pouco mais de ar ao código):Como mosvy aponta nos comentários abaixo: Se
/bin/sh
acontecer de você ser odash
shell, ou algum outro shell que não seja redefinido corretamenteIFS
quando uma nova sessão de shell for iniciada (isso é exigido pelo POSIX), e se você tiver, por um motivo ou outro, exportadoIFS
e dado a ele um valor não padrão, então você pode querer usarunset IFS
na parte superior do script acima.Faça isso sempre que tiver corrigido todos os outros problemas que a exportação
IFS
sem dúvida levantou (não exporteIFS
).Em um shell POSIX mínimo, que não suporta nenhum array, você pode simplesmente manipular a lista de argumentos posicionais com o
set
comando. Pouco antes dofor
loop você pode fazere agora execute seu loop for como
Se o seu shell suporta array bourne novamente shell
bash
,zsh
ou outro, você pode simplesmente usar um arraye agora chame o script como
Conforme apontado nos comentários, você não está usando o valor real de
snr
value do loop for. Use o valor conforme$snr
aplicável nos argumentos do script; nesse caso, talvez seja necessário mover a lógica de construção da lista de argumentos para dentro do loop.Construa o argumento em uma variável com base na entrada:
(Também inclui a correção da variável de loop no corpo do loop)
Você pode fazer isso em uma única linha usando a substituição de comando
A única maneira de fazer uma expansão variável desaparecer é fazer com que a expansão se expanda para um valor vazio quando essa expansão estiver sem aspas.
Ambos os valores não definidos e vazios de uma variável (
a
eb
) desaparecem (como argumentos) quando não estão entre aspas. Ambos são mantidos quando citados.Além disso, até mesmo os espaços (ou qualquer caractere) desaparecerão se incluídos no IFS.
Na verdade, um IFS que contém caracteres no valor a ser expandido (sem aspas) separará os argumentos.
Observe os dois argumentos
<s>
e<t>
que resultaram da expansão do valorset
quando o IFS continhae
.Portanto, precisamos de uma expansão sem aspas de valores não definidos ou vazios que se torne uma expansão entre aspas do valor quando houver um valor a ser expandido:
Descrição:
Podemos então usar o
$1
valor para desaparecê-lo ou expandi-loA linha acima imprimirá dois argumentos separados (não afetados pelo IFS) se
$1
tiver algum valor (não nulo) ou nada se$1
estiver vazio ou não definido.O roteiro ficará:
Esta solução não é afetada pelo valor de IFS