Ola pessoal,hoje vamos falar um pouco sobre shell script. O objetivo e criar um script, muito simples, que seja capaz de alterar a extensao de nossos arquivos.Para testar, vamos criar em nosso diretorio de testes os seguintes arquivos:ChangeExtension.sh -> nosso scriptFirst.txt -> arquivo para testesSecond.txt -> arquivo para testesBom, agora, vamos ao nosso script, que pega o nome os arquivos, e troca a sua extensao de acordo com os parametros passados a eles:NUMBER_OF_ARGUMENTS=$#ORIGINAL_EXTENSION=$1NEW_EXTENSION=$2if [ $NUMBER_OF_ARGUMENTS -ne 2 ]then echo "you need to pass two extensions like: ChangeExtension .txt .teste" exit 1fiecho "Original Extension: " $ORIGINAL_EXTENSIONecho "New Extension: " $NEW_EXTENSIONfor file in $(ls | awk -F"." '{print $1}')do if [ -e $file$ORIGINAL_EXTENSION ] then mv -v $file$ORIGINAL_EXTENSION $file$NEW_EXTENSION fidoneO que e feito e basicamente o seguinte:1 - pegamos os argumentos passados passados pela linha de comando: $1 e o primeiro $2 e o segundo. $# e o numero de argumentos.2o - Testamos se o numero de argumentos e valido3 - Para cada arquivo com a extensao informada, a substituimos pela nova extensao.Vamos a um exemplo:Vamos renomear nossos arquivos de .txt para .old.txtApenas digitamos o comando: ./ChangeExtension.sh .txt .old.txtResultado:ChangeExtension.sh -> nosso script, inalteradoFirst.old.txt Second.old.txt -> dois arquivos com a extensao alterada.Bom, por hoje e isso Em alguns casos podemosdesejar nao ter um numero de argumentos fixos em nossas funcoes,como e caso da funcao printf. Existe uma forma de implementar essemecanismo, bem simples, como veremos a seguir:va_listTipo usado paraarmazenar informacoes sobre nossa lista de argumentos. Ela estadeclarada em <stdarg.h>. Existem tres macros nesse headerresponsaveis por manipular a lista, sao elas:void va_start(va_listap, last);Responsavel porinicializar nossa lista "ap".type va_arg(va_list ap,type);Retorna o proximoargumento da listavoid va_end(va_listap);Cada va_start precisaser finalizada com um va_end.Para exemplificar,vamos fazer um funcao que recebe um numero variavel de argumentosdo tipo int, e retorna a soma deles. #include <stdarg.h>#include <stdio.h>int IntSum(int TotalNumbers,...){ va_list numbers; int TotalSum, counter; va_start(numbers,TotalNumbers); TotalSum = 0; for(counter = 0; counter < TotalNumbers;counter++){ TotalSum+=va_arg(numbers,int); } va_end(numbers); return TotalSum;}int main(){ printf("\n\t Soma Total 5 + 2 + 3 + 35 = %d",IntSum(4,5,2,3,35)); printf("\n\t Soma Total 10 + 2 = %d",IntSum(2,10,2)); return 1;}Apos compilar e executar, o resultado deve ser:Soma Total 5 + 2 + 3 + 35 = 45Soma Total 10 + 2 = 12Veja que o primeiro parametro indica quantos elementos estamos passando. Hoje vamos aprender a usar algumas diretivas de compilacao. As vezes e necessario fazermos um debug de nosso programa. Para isso ao inves de definirmo um #define em nosso codigo, vamos incluir no momento da compilacao.Vamos ver um pequeno exemplo. Vamos criar um arquivo em c com o seguinte codigo:#include <stdio.h>#include <stdlib.h>int main(){ int num1, num2, result; printf("\n\tDigite o priemiro Numero: "); scanf("%d",&num1); printf("\n\tDigite o segundo Numero: "); scanf("%d", &num2); #ifdef DEBUG printf("\n\tOs valores que voce digitou: %d %d", num1, num2); #endif printf("\n\tResultado %d + %d = %d", num1, num2, num1 + num2); return 1;}Agora, vamos compilar o nosso codigo com a seguinte sintaxe: gcc -D DEBUG -o somaDoisN soma.cQuando o programa for executado, ele vai mostrar na tela o printf entre o #ifdef e o #endifVamos mudar a compilacao, vamos retirar a diretiva de compilacao para DEBUG:gcc