Linux Shell Script para automatizar a clonagem de uma fonte git

2

Estou tentando criar um script de shell que me permite automatizar a clonagem de uma fonte git, o código é mostrado abaixo: -

#!/bin/sh
mkdir /home/my-username/git-sources
cd home/my-username/git-sources

read gitsource

git clone $gitsource

echo "Please choose from the options bellow"

echo "1)Go back to your working directory"
echo "2) GO to the 'git-sources' folder"

read ans
back="1"
stay="2"
if [$ans == $back]; then
      cd -
elif [$ans == $stay]; then
      cd /home/my-username/git-sources
fi

Meu problema começa na linha 12 Eu quero fazer isso para que o usuário tenha a opção de decidir se ele quer voltar ao seu diretório de trabalho, mas eu recebo um erro na linha 20 e na linha 22 dizendo que o comando não foi encontrado

./git-installer.sh: line 20: [1: command not found
./git-installer.sh: line 21: [1: command not found
    
por Harikesha Suresh 25.12.2017 / 21:56

1 resposta

3

Existem muitos problemas com este script. Primeiro, vamos verificar o que shellcheck , uma ferramenta semelhante a lint para shell scripts tem a dizer sobre isso:

$ ~/.cabal/bin/shellcheck git-installer.sh

In git-installer.sh line 17:
if [$ans == $back]; then
^-- SC1009: The mentioned parser error was in this if expression.
   ^-- SC1035: You need a space after the [ and before the ].
   ^-- SC1073: Couldn't parse this test expression.
                  ^-- SC1020: You need a space before the ].
                  ^-- SC1072: Missing space before ]. Fix any mentioned problems and try again.

Essa é uma fonte do seu erro e uma sugestão do que deve ser feito para evite o erro. Você precisa adicionar um espaço em branco antes e depois de cada colchete para que seu script fique assim:

#!/bin/sh
mkdir /home/my-username/git-sources
cd home/my-username/git-sources

read gitsource

git clone $gitsource

echo "Please choose from the options bellow"

echo "1)Go back to your working directory"
echo "2) GO to the 'git-sources' folder"

read ans
back="1"
stay="2"
if [ $ans == $back ]; then
      cd -
elif [ $ans == $stay ]; then
      cd /home/my-username/git-sources
fi

Mas shellcheck ainda não está feliz:

$ ~/.cabal/bin/shellcheck git-installer.sh

In git-installer.sh line 3:
cd home/my-username/git-sources
^-- SC2164: Use cd ... || exit in case cd fails.


In git-installer.sh line 5:
read gitsource
^-- SC2162: read without -r will mangle backslashes.


In git-installer.sh line 7:
git clone $gitsource
          ^-- SC2086: Double quote to prevent globbing and word splitting.


In git-installer.sh line 14:
read ans
^-- SC2162: read without -r will mangle backslashes.


In git-installer.sh line 17:
if [ $ans == $back ]; then
     ^-- SC2086: Double quote to prevent globbing and word splitting.
          ^-- SC2039: In POSIX sh, == in place of = is undefined.


In git-installer.sh line 18:
      cd -
      ^-- SC2164: Use cd ... || exit in case cd fails.


In git-installer.sh line 19:
elif [ $ans == $stay ]; then
       ^-- SC2086: Double quote to prevent globbing and word splitting.
            ^-- SC2039: In POSIX sh, == in place of = is undefined.


In git-installer.sh line 20:
      cd /home/my-username/git-sources
      ^-- SC2164: Use cd ... || exit in case cd fails.

Além de corrigir todos os erros e avisos informados por shellcheck , poderia melhorar este script um pouco mais.

Você pode usar um "$HOME" simples e simples em vez de /home/my-username para que o script funcione para cada usuário.

Observe também que mkdir no topo deve ser feito somente se o diretório ainda não existe, nós obteremos File exists erro caso contrário.

Seria bom imprimir um pequeno aviso para o usuário dizendo a eles que esperamos que eles recebam informações.

Observe também que para executar cd como você provavelmente imagina tem que source este script em vez de executá-lo. Dito isto, devemos desobstruir o ambiente do usuário desabilitando as variáveis que criado para as nossas necessidades.

Para resumir, deve ser:

#!/bin/sh

if [ ! -d "$HOME"/git-sources ]; then
    mkdir "$HOME"/git-sources
fi

cd "$HOME"/git-sources || { printf "cd failed, exiting\n" >&2;  return 1; }

printf "Gitsource: "
read -r gitsource

git clone "$gitsource"

unset gitsource

echo "Please choose from the options bellow"

echo "1) Go back to your working directory"
echo "2) Go to the 'git-sources' folder"

read -r ans
back="1"
stay="2"
if [ "$ans" = "$back" ]; then
      cd - || { printf "cd failed, exiting\n" >&2; unset ans; return 1; }
elif [ "$ans" = "$stay" ]; then
      cd "$HOME"/git-sources || { printf "cd failed, exiting\n" >&2; unset ans; return 1; }
fi

unset ans

Fonte:

$ . git-installer.sh
Gitsource: https://github.com/antirez/linenoise
Cloning into 'linenoise'...
remote: Counting objects: 396, done.
remote: Total 396 (delta 0), reused 0 (delta 0), pack-reused 396
Receiving objects: 100% (396/396), 114.69 KiB | 0 bytes/s, done.
Resolving deltas: 100% (232/232), done.
Checking connectivity... done.
Please choose from the options bellow
1) Go back to your working directory
2) Go to the 'git-sources' folder
2
$ pwd
/home/ja/git-sources
$ ls -Al
total 4
drwxr-xr-x 3 ja users 4096 Dec 25 22:48 linenoise
    
por 25.12.2017 / 22:47