Script Bash para criar um diretório

7

Eu estou brincando com scripts, eu sou capaz de criar um script que quando executar me pede um nome para um novo dir, cria, em seguida, cria vários arquivos, ecoa linhas para fora e, em seguida, exclui tudo.

O que eu gostaria de fazer é transformá-lo um pouco para que ele crie e nomeie o diretório sozinho!

Parece um exercício inútil, eu sei, mas brincar com isso é a melhor maneira que eu aprendo.

Aqui está meu script atual:

#!/bin/bash   
echo "Give a directory name to create:"    
read NEW_DIR    
ORIG_DIR=$(pwd)    
[[ -d $NEW_DIR ]] && echo $NEW_DIR already exists, aborting && exit    
mkdir  $NEW_DIR    
cd $NEW_DIR    
pwd    
for n in 9 8 7 6 5 4 3 2 1 0    
do        
touch file$n    
done

ls file?    

for names in file?    
do       
echo This file is named $names > $names    
done

cat file?

cd $ORIG_DIR

rm -rf $NEW_DIR

echo "Goodbye"
    
por SimplySimplified 04.09.2017 / 11:34

4 respostas

5

Em vez de usar o comando read para obter o valor de NEW_DIR da entrada, você pode definir o valor codificado para a variável NEW_DIR da seguinte maneira:

substitua a seguinte linha no seu script:

read NEW_DIR    

com a seguinte linha:

NEW_DIR="new_dir_hard_coded_value"
  

Link para mais informações sobre bash-scripting-tutorial / bash-variables

    
por Yaron 04.09.2017 / 11:49
5

Se você quiser uma surpresa, em vez de codificar o nome, você pode usar uma técnica para gerar uma string aleatória, por exemplo

NEW_DIR=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w8 | head -n1)

Isso define NEW_DIR como uma seqüência de oito caracteres alfanuméricos. Toda vez que você executar o script, o novo diretório terá um nome aleatório diferente ...

Ou para obter uma palavra aleatória, escolha um dicionário em /usr/share/dict/ e use shuf , por exemplo:

$ shuf -n1 /usr/share/dict/british-english
soupier
$ shuf -n1 /usr/share/dict/british-english
penguins

Então

NEW_DIR=$(shuf -n1 /usr/share/dict/british-english)
mkdir "$NEW_DIR"
...
    
por Zanna 04.09.2017 / 12:50
3

Em vez de solicitar a entrada do usuário, você pode codificar valores em scripts usando o operador de atribuição de variável (=). Assim, as duas linhas seguintes,

echo "Give a directory name to create:"
read NEW_DIR

pode ser substituído por uma única linha.

NEW_DIR="whatever_name_you_please"


BTW, sei que isso não é relevante para a pergunta, mas no loop for usado em seu script, você pode escrever um código abreviado para o intervalo. Em vez de 9 8 7 6 5 4 3 2 1 0 , você pode escrever como

 for n in {9..0} 
    
por Mukesh Sai Kumar 04.09.2017 / 11:56
3

Você poderia até mesmo dar um passo adiante: você poderia dizer "read" para oferecer uma proposta para o nome da pasta, aceitá-la pressionando-a ou alterá-la como quiser:

read -p "Give a directory name to create: " -ei "default_name" NEW_DIR;

isso mostraria uma linha:

Give a directory name to create: default_name

Para combinar com as sugestões acima, você pode fazer o seguinte:

# pre-set NEW_DIR to a value or to any random string 
# as suggested in the other answers
NEW_DIR="default_name"

# Prompt for new directory name, suggesting previously selected default answer
read -p "Give a directory name to create: " -ei "$NEW_DIR" NEW_DIR;

Note que ler -p "text" solicitará o texto e solicitará a resposta na mesma linha. Se você quer se ater ao seu código e pedir o formato de 2 linhas que você poderia fazer

echo "Give a directory name to create:"  
read -ei "$NEW_DIR" NEW_DIR
    
por stealz 04.09.2017 / 20:05