Bash shell scripting pergunta básica sobre a sintaxe e o nome da base

2

Considere o script abaixo:

myname='basename $0';
for i in 'ls -A'
do
 if [ $i = $myname ]
 then
  echo "Sorry i won't rename myself"
 else
  newname='echo $i |tr a-z A-Z'
  mv $i $newname
 fi
done

1) Estou ciente de que basename $0 significa meu nome de script aqui. Mas como? a explicação da sintaxe por favor. O que significa $0 ?

2) Em quais casos ";" é usado no final da instrução em um script? Por exemplo, a primeira linha do script termina com; enquanto a 8ª linha não. Além disso, descobri que adicionar / remover pontos-e-vírgulas no final de algumas linhas (por exemplo: linhas 1ª / 6ª / 8ª) realmente não tem qualquer significado e o script é executado corretamente com ou sem ele.

    
por Being Gokul 23.09.2013 / 12:41

2 respostas

4

$0 é apenas uma variável bash interna. De man bash :

   0      Expands  to  the  name  of  the shell or shell
          script.  This is set at shell  initialization.
          If bash is invoked with a file of commands, $0
          is set to the name of that file.  If  bash  is
          started  with the -c option, then $0 is set to
          the first argument after the string to be exe‐
          cuted,  if  one  is present.  Otherwise, it is
          set to the file name used to invoke  bash,  as
          given by argument zero.

Portanto, $0 é o nome completo do seu script, por exemplo, /home/user/scripts/foobar.sh . Como muitas vezes você não quer o caminho completo, mas apenas o nome do próprio script, use basename para remover o caminho:

#!/usr/bin/env bash

echo "\
#!/usr/bin/env bash

## Multiple statements on the same line, separate with ';'
for i in a b c; do echo $i; done

## The same thing on  many lines => no need for ';'
for i in a b c
do 
  echo $i
done
is $0" echo "basename is $(basename $0)" $ /home/terdon/scripts/foobar.sh $0 is /home/terdon/scripts/foobar.sh basename is foobar.sh

O ; só é realmente necessário no bash se você escrever várias instruções na mesma linha. Não é necessário em nenhum lugar no seu exemplo:

   0      Expands  to  the  name  of  the shell or shell
          script.  This is set at shell  initialization.
          If bash is invoked with a file of commands, $0
          is set to the name of that file.  If  bash  is
          started  with the -c option, then $0 is set to
          the first argument after the string to be exe‐
          cuted,  if  one  is present.  Otherwise, it is
          set to the file name used to invoke  bash,  as
          given by argument zero.
    
por 23.09.2013 / 13:12
3

What does $0 mean?

De man bash , seção PARAMETERS , subseção Special Parameters :

   0      Expands to the name of the shell or shell script.  This  is  set
          at shell initialization.  If bash is invoked with a file of com‐
          mands, $0 is set to the name of that file.  If bash  is  started
          with  the  -c option, then $0 is set to the first argument after
          the string to be executed, if one is present.  Otherwise, it  is
          set  to  the file name used to invoke bash, as given by argument
          zero.

Ele diz 0 , mas $0 significa porque $ identifica um parâmetro.

Você pode encontrar essas informações em man pages facilmente usando a chave de busca / . Apenas digite /\$ seguido de retorno. O \$ tem que ser citado como $ neste caso porque o ; tem um significado especial ao pesquisar, e a barra invertida é necessária para "escapar" desse significado especial.

In what cases ";" is used at the end of statement in a script?

Normalmente, apenas quando você deseja colocar pelo menos duas instruções em uma única linha, por exemplo, este seria um caso em que você pode usar ; :

if [ $i = $myname ]; then

Não há nenhum caso em seu script de exemplo em que o man bash seja necessário, você pode removê-lo da primeira linha. Detalhes podem ser encontrados novamente em %code% :

Lists
   A  list  is a sequence of one or more pipelines separated by one of the
   operators ;, &, &&, or ||, and optionally terminated by one of ;, &, or
   <newline>.

   [...]

   A sequence of one or more newlines may appear in a list  instead  of  a
   semicolon to delimit commands.

   If  a  command  is terminated by the control operator &, the shell exe‐
   cutes the command in the background in a subshell.  The shell does  not
   wait  for  the command to finish, and the return status is 0.  Commands
   separated by a ; are executed sequentially; the shell  waits  for  each
   command  to terminate in turn.  The return status is the exit status of
   the last command executed.
    
por 23.09.2013 / 13:09