Se você não citar a variável "$1"
, ela se tornará nada e desaparecerá. O código executado é então (conforme relatado pela opção -x
do shell):
[ -f ]
O qual, como -f
é uma string com um comprimento diferente de zero, resulta em um teste verdadeiro e executa a parte then
.
Você precisa escrever (pelo menos):
[ -f "$1" ]
Que, com um argumento vazio, se tornará
[ -f "" ]
e relatar uma falha para corresponder ao arquivo ""
.
Uma outra alternativa é usar uma expansão de parâmetro (sem necessidade de cotação externa):
[ -f ${1:-""} ]
Ele será expandido para ""
se o valor de $1
for nulo ou vazio.
E por favor, não faça um loop para percorrer as linhas de um arquivo. Você deve considerar usar um while read
loop
#!/bin/sh
if [ -f ${1:-""} ]; then
while read -r line; do
echo '<something>'
done <"$1"
elif [ "$#" -eq 0 ]; then
echo "code2"
else
echo "code3"
fi