Por que “$ Namefile *” me dá esse resultado?

2

No meu código, existe essa parte;

Namefile=$1
for n in $Namefile*
do
echo $n
done

e apenas para o resultado desta parte,

$ sh example.sh hw1
hw1_evening_sun.txt
hw1_morning_sun.txt
hw1_out_si_wire.txt
hw1_script.sh
hw1_script2.sh
hw1_script3.sh
hw1_sun1.txt
hw1_sun2.txt

quais são os arquivos cujo nome começa com "hw1", mas eu não entendo porque $ Namefile * leva esses nomes .Como eu sei * chama o argumento que o script recebe .

Por que esse método funciona assim? Alguém poderia explicar a lógica por trás disso?

    
por onurcanbektas 03.06.2016 / 06:27

4 respostas

1

I don't understand why $Namefile* takes these names.As far as I know * calls the the argument which the script receives.

$ Namefile expande para o valor que você passou (provavelmente "hw"). Isso significa que $ Namefile * após a expansão da variável se torna "hw *".

Quando esta string é usada em um local onde é interpretada como um nome de arquivo, o * é especial. Veja "expansão do nome do caminho" na página man.

... bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.

    
por 03.06.2016 / 08:23
1

Aqui você está fazendo uma substituição em você por loop. Então estrela irá corresponder a todos os caracteres após $Namefile string (que eu acho que é "hw1"). Se você quiser corresponder todos os argumentos fornecidos ao script, use a variável interna $* . Em seu script, você está salvando $1 (parâmetro posicional número 1), que é wh1 para a variável Namefile. Portanto, usar * após $Namefile tem um significado diferente de $* . Para mais informações, veja aqui Variáveis internas (seção Parâmetros posicionais)

    
por 03.06.2016 / 07:55
0

É simplesmente por causa da opção -l de ls . Nesse caso, porque $Namefile* expandiria para hw1_evening_sun.txt ..snip.. hw1_sun2.txt :

ls -l $Namefile*

é efetivamente igual a

ls -l hw1_evening_sun.txt ..snip.. hw1_sun2.txt

Para mais informações, você pode executar man ls . Aqui eu cito:

...  
   -l     use a long listing format  
...

Bem-vindo ao * nix.

    
por 03.06.2016 / 06:33
0

É porque o seu loop é assim. Para que a saída seja a esperada para -l você precisaria executar essa parte do script dentro dos backticks como abaixo.

tmp.sh

Namefile=$1
for n in $Namefile*
do
echo $n
done

Execute essa parte específica como

ls -l './tmp.sh "d"'

-bash-3.2$ ls -l './again d'
-rw-r--r-- 1 me me 0 Jun  3 05:16 dat
-rw-r--r-- 1 me me 0 Jun  3 05:16 dis
    
por 03.06.2016 / 07:26