Como diferentes operadores lidam com uma determinada string

0

Eu quero ler duas strings como parâmetros para bash script, essas strings são para extensões, então eu quero substituir a extensão de arquivos com a primeira extensão para a segunda extensão.

O melhor que pude pensar / encontrar até agora é:

#!/bin/bash
first=$1
second=$2
for files in *.$1
do
  mv "$files" "${files%.$1}.$2"
done

Agora, suponhamos que $1 seja cpp e $2 seja C

Minhas "dúvidas" são:

  1. seria .$1 igual a .cpp ?
  2. *.$1 é igual a dizer: *.cpp ?
  3. A linha 6 é igual a mv "$files" "${files%.cpp}.C" ?
  4. O código anterior lidaria com nomes de arquivos com espaços (como: my file.cpp ) ou pontos (como my.file.cpp )?

Eu sei que eu poderia ter dito as 3 primeiras perguntas em uma pergunta, mas preciso entender exatamente o que está acontecendo e como cada operador ( . / * / % ) lida com um dado string em um parâmetro.

    
por user2750466 21.01.2014 / 04:13

2 respostas

1

Você tem dois erros de digitação, escrevendo & em vez de $ para endereçar variáveis, mas caso contrário, deve funcionar.

Além disso, nomes de arquivos com espaços funcionarão, já que você os citou corretamente.

Detalhes mínimos: recomendo renomear a variável $files para $file , pois ela sempre contém apenas um único nome de arquivo da lista em loop.

    
por 21.01.2014 / 11:33
1

Seu código está correto com a observação secundária de Joseph R. sobre arquivos contendo um traço. No entanto, as linhas 2 e 3 parecem redundantes, porque você não usa as variáveis first e second no snippet.

Para aliviar suas "dúvidas" (assumindo que $1 é cpp e $2 é C ):

  1. O . não é um operador aqui, então o bash faz apenas uma expansão de parâmetro no $1 . Então a resposta é sim, .$1 é igual a .cpp
  2. A expansão do parâmetro tem precedência sobre a expansão do nome do caminho ( link ), ou seja, *.$1 é igual a *.cpp
  3. Novamente, a linha faz o que você supõe, porque primeiro o $1 é expandido para ser entregue ao algoritmo de correspondência de padrões evocado pelo %
  4. As aspas duplas evitam que o bash faça divisão de campo , que geralmente causa problemas com nomes de arquivos contendo espaços
por 21.01.2014 / 14:34