Como eu mudo a entrada de um script para ser o primeiro argumento na CLI?

2

Eu tenho um script chamado renomear, e onde ele afirma ./wid_*.jil eu quero ser capaz de inserir essas informações a partir da linha de comando durante a execução do script.

for file in ./wid_*.jil
do
    mv -i "${file}" "${file/orig/update}"
done

Na linha de comando eu gostaria de poder entrar

[user@location dir1]$ rename dir2/

O script procuraria em dir2/ e renomear todos os arquivos com orig em seu nome para update .

Sou muito novo no unix / linux, por isso, peço desculpa se a minha terminologia estiver desactivada ou se a minha descrição for fraca.

    
por Emile 12.01.2017 / 19:15

2 respostas

3

$ 1 será o primeiro argumento do seu script bash:

#!/bin/bash

directory="$1"

echo "$directory"

Você também pode realizar algumas verificações, por exemplo,

#!/bin/bash

directory="$1"

[ -z "$directory" ] && echo "Please provide a directory" && exit 1
[ ! -d "$directory" ] && echo "Directory not found" && exit 2

for file in "$directory"/wid_*.jil
do
    mv -i "${file}" "${file/orig/update}"
done
    
por 12.01.2017 / 19:21
1

O shell armazena todos os argumentos da linha de comando no que é chamado de parâmetros posicionais , $1 , $2 , $3 etc.

Um script simples que renomeia todos os arquivos que correspondem a wid_*.jil em um diretório, substituindo a string orig por update no nome do arquivo, pode ter esta aparência:

#!/bin/sh

dir="$1"

if [ -d "$dir" ]; then
  printf 'No such directory: %s\n' "$dir" >&2
  exit 1
fi

for filepath in "$dir"/wid_*.jil; do
  filename="$( basename "$filepath" | sed 's/orig/update/g' )"
  mv -i "$filepath" "$dir/$filename"
done

Ou, sem usar utilitários externos, com bash :

#!/bin/bash

dir="$1"

if [[ -d "$dir" ]]; then
  printf 'No such directory: %s\n' "$dir" >&2
  exit 1
fi

for filepath in "$dir"/wid_*.jil; do
  filename="${filepath##*/}"
  filename="${filename//orig/update}"

  mv -i "$filepath" "$dir/$filename"
done
    
por 12.01.2017 / 19:43