Escrevendo script Unix (bash) que cria um diretório no local especificado na linha de comando

0

Atualmente tenho um script Unix (escrito em bash) que executa vários comandos para modificar um grupo de arquivos, que eu especifico com um flist contendo seus caminhos. A ideia geral do script é criar um diretório, colocar arquivos do flist nesse diretório e executar os processos subsequentes, alguns dos quais estão criando mais diretórios.

O problema que tenho com isso é que devo especificar o caminho exato do arquivo onde eu quero que os diretórios estejam localizados dentro do próprio script. Então, minha pergunta é: existe uma maneira de escrever o script de tal forma que eu possa inserir o comando e, em seguida, o caminho da pasta de destino de onde gostaria que o script fosse executado na linha de comando e ter os diretórios inicial e todos os diretórios subseqüentes criados? pelo script dentro do diretório inicial sem ter que fornecer nenhum de seus caminhos (por exemplo, 'comando / destino / caminho / para / script /')?

Desculpas se isso for um pouco prolixo. Sou novo no Unix e tenho pouca experiência (e, consequentemente, não consegui escrever melhor). Qualquer ajuda é apreciada!

    
por David 25.04.2013 / 19:38

2 respostas

3

Se eu entendi corretamente, você está perguntando como passar valores para um script bash. Isso é muito fácil, por exemplo:

#!/usr/bin/env bash
directory=$1;
echo "Directory is $directory"

$1 é o primeiro argumento de linha de comando de um script bash. $2 é o segundo etc etc. Então, você pode executar o script acima da seguinte forma:

./foo.sh /path/to/bar
Directory is /path/to/bar

Se você quiser que o comando seja uma variável, você pode fazer algo assim:

 #!/usr/bin/env bash
 command=$1;
 directory=$2
 $command $directory

Então, para executar ls /etc , você executaria o script acima assim:

./foo.sh ls /etc
    
por 25.04.2013 / 19:43
0

Eu imagino que você tenha arquivos em um lugar ( /path/to/originals ) e queira copiá-los para um local de destino ( /path/to/destination ) e modificá-los depois. Seu script atual se parece com:

mkdir /path/to/destination
cp /originals/this-file /path/to/destination
cp /originals/this-other-file /path/to/destination
modify-somehow /path/to/destination/this-file
modify-somehow /path/to/destination/this-other-file

mas você não gosta de ter hardcode / path / to / destination em todos os lugares. Então você pode pedir para usar "o valor do primeiro parâmetro posicional" em vez de codificar /path/to/destination . Como outros mencionaram, o valor do primeiro parâmetro posicional é $1 .

Portanto, o seu script deve ser:

mkdir $1
cp /originals/this-file $1
cp /originals/this-other-file $1
modify-somehow $1/this-file
modify-somehow $1/this-other-file

E você deve invocar isso adicionando o caminho de destino como um argumento:

my-script /path/to/destination

Eu tentei manter o script simples, mas você poderia melhorá-lo, como usar um único comando cp para copiar vários arquivos. Você também pode usar uma variável para o caminho /originals (mas, em vez de um argumento, este aqui soa como uma declaração constante no início do seu script)

Por fim, considere que, se os nomes dos seus arquivos tiverem espaços, você precisará colocar o seu $1 entre aspas duplas.

    
por 25.04.2013 / 20:25