Algumas perguntas sobre Bash para um novato

0

Estou estudando Bash, mas há algumas coisas que não são explicadas no meu livro. Primeiro, vou postar um script e depois vou fazer perguntas por meio de scripts.

Script Bash:

$ cat sortmerg
#!/bin/bash
usage ()
{
if [ $# -ne 2 ]; then
echo "Usage: $0 file1 file2" 2>&1
exit 1
fi
}

# Default temporary directory
: ${TEMPDIR:=/tmp}

# Check argument count
usage "$@"

# Set up temporary files for sorting
file1=$TEMPDIR/$$.file1
file2=$TEMPDIR/$$.file2

# Sort
sort $1 > $file1
sort $2 > $file2

# Open $file1 and $file2 for reading. Use file descriptors 3 and 4.
exec 3<$file1
exec 4<$file2

# Read the first line from each file to figure out how to start.
read Line1 <&3
status1=$?
read Line2 <&4
status2=$?

# Strategy: while there is still input left in both files:
# Output the line that should come first.
# Read a new line from the file that line came from.
while [ $status1 -eq 0 -a $status2 -eq 0 ]
do
if [[ "$Line2" > "$Line1" ]]; then
echo -e "1.\t$Line1"
read -u3 Line1
status1=$?
else
echo -e "2.\t$Line2"
read -u4 Line2
status2=$?
fi
done

# Now one of the files is at end-of-file.
# Read from each file until the end.
# First file1:
while [ $status1 -eq 0 ]
do
echo -e "1.\t$Line1"
read Line1 <&3
status1=$?
done
# Next file2:
while [[ $status2 -eq 0 ]]
do
echo -e "2.\t$Line2"
read Line2 <&4
status2=$?
done
# Close and remove both input files
exec 3<&- 4<&-
rm -f $file1 $file2
exit 0

Perguntas:

  1. Primeiro, como recuo códigos no Gedit? Copiei e colei códigos de um livro e ele não recua os códigos automaticamente. Você costuma usar o Gedit ou qualquer outro editor popular para scripts de bash?

  2. : ${TEMPDIR:=/tmp}
    Você pode explicar o que é isso? Eu tenho conhecimento de programação de C # e outras linguagens de programação. Então, você pode me dizer, assumindo que eu não sou totalmente novato em programação, o que a chave : e as chaves de colchetes fazem?

  3. if [[ "$Line2" > "$Line1" ]]; then e [] é o mesmo que o teste. Mas por que [[]] faz alguma diferença?

  4. status1=$?
    o que é $? ?

Muito obrigado antecipadamente.

    
por user198436 10.10.2013 / 17:24

3 respostas

5
  1. Eu uso o vim para escrever scripts de shell.

  2. ${TEMPDIR} será expandido para o valor da variável denominada TEMPDIR. ${TEMPDIR:=/tmp} fará o mesmo, mas se estiver vazio (ou não definido), o valor / tmp será atribuído a TEMPDIR e também expandido.

    Ter ${TEMPDIR:=/tmp} sozinho em uma linha fará com que seja alterado para, por exemplo, /tmp que tentará executar /tmp como um comando (o que obviamente falhará, já que você não pode executar um diretório). É por isso que o comando : (null) é usado. O comando null ignora todas as entradas, todos os argumentos e não faz absolutamente nada. Execute help : para ver a descrição desse comando interno.

    Veja link Para as várias coisas que você pode fazer com a Expansão de Parâmetros.

  3. [[ "$line2" > "$Line1" ]] retornará verdadeiro se a linha2 classificar após a linha1 (como strcmp em C).

    [(comando "test") e comando [[(new test)] são usados para avaliar expressões. [[funciona apenas em Bash, Zsh e o shell Korn, e é mais poderoso; [e teste estão disponíveis em shells POSIX.

    Consulte o link para obter a diferença entre o comando [ e a palavra-chave [[ .

  4. ? é um parâmetro especial que detém o status de saída do último comando executado. $? expande o valor desse parâmetro.

Em uma nota lateral, se esse for um exemplo do seu livro, eu diria que é uma fonte ruim para aprender bash. Recomendo a leitura do link que também ensina boas práticas.

    
por geirha 10.10.2013 / 17:38
5

Sim, você tem recuo no Gedit. Abra o gedit e em Edit- > Preferências você pode ter a opção de recuo automático.

Sobre o segundo ponto, é como dizer que o TEMPDIR está em /tmp location.

    
por rɑːdʒɑ 10.10.2013 / 17:35
0
  1. Para recuar o código no Gedit, pressione a tecla Tab e Shift - a aba para desmembrar. Todas as informações que você precisa e a lista de teclas de atalho estão na seção Documentação do Gnome para gedit
  2. O comando : é um comando Bash interno que não faz nada, exceto retornar 0 (verdadeiro); mas, neste caso, serve para permitir a avaliação da expansão do parâmetro ${VAR:=VALUE} , que atribui VALUE a $VAR apenas se não existir. Se $VAR (no seu caso $TEMPDIR ) já tiver um valor, ele não será modificado. É equivalente ao constructo:

    [[ -z "$TEMPDIR" ]] && TEMPDIR=/tmp
    

    , ou seja, "se $TEMPDIR estiver vazio, avalie o comando à direita (atribua /tmp a TEMPDIR )".

  3. O comando [[ é um comando Bash interno, enquanto [ é um comando executável em /usr/bin/[ (assim como seu equivalente /usr/bin/test ). O comando [[ tem vários prós e contras versus [ ou test .

    Prós: É um comando interno, portanto, é mais rápido e tem mais funcionalidade, como verificação e análise de expressões regulares (lembre-se: man bash é seu amigo).

    Contras: Não é portátil, pois tem operadores diferentes disponíveis em cada um dos interpretadores de shell onde ele existe.

  4. A expressão $? é, como a terminologia em man bash , um parâmetro especial que resolve ou "expande" para o status de saída do último comando. Se o último comando foi bem sucedido, deve retornar true (0 para Bash), então $? será um zero numérico; em outros casos, $? será o número retornado pelo comando. Por exemplo, esta linha de comando ls / echo mostrará o valor de erro retornado por ls tentando encontrar o arquivo an-nonexistent-file.txt :

    ls an-nonexistent-file-txt ; echo $?
    

O Bash como linguagem de programação tem muitas peculiaridades e peculiaridades; estudar o manual do Bash é o caminho para o sucesso.

[Desculpe pela aparente resposta duplicada, mas os outros foram inespecíficos e não responderam todas as perguntas que foram feitas (não significa ofender; eu aprendi algumas coisas não relacionadas lá).]

    
por Fjor 19.04.2018 / 18:25