Потому что во втором примере $f
расширяется вашей оболочкой, а не cat
. Предполагая, что f
не установлено иначе в среде вашей оболочки, $f
расширяется до пустой строки, а cat
затем читается со стандартного ввода, как если бы не было аргументов.
В вашем первом примере $f
находится внутри одинарных кавычек, поэтому он не расширяется исходной оболочкой, но расширяется экземпляром sh
, который видитcat "$f"
и имеет набор f
в своей среде.
в аргументах следует использовать кавычки...
и используйте $m вместо m в цикле for
#!/bin/bash
file_locker(){
m="$1"
for ((i=1;i<=$m;i++));
do
num=($(( 0 + RANDOM % 9 )))
echo -n "$num"
done > "$3"
mypin=$(echo "$3")
echo pin "$mypin"
myhash=$(echo "$mypin" | sha256sum)
echo hash "$myhash"
zip -P "$myhash" "$2".zip -r "$2" && rm "$2"
}
file_locker "$1" "$2" "$3"
zip error: Invalid command arguments..
вы получите это, если в вашем аргументе есть пробелы...