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