Erro ao atribuir o diretório atual a uma variável

2
    #!/usr/bin/env bash  
    if [ "$outDir" == "" ]
    then
        echo "$PWD" ,"We are here ", $outDir ," with " 
        "$outDir" = "$PWD"
        echo "Yes"
    fi

Saída no terminal:

/home/Documents/folderName ,We are here , , with

./pipeline.sh: line 28: : command not found

Yes

Não consigo atribuir o diretório atual a $ outDir.

Eu tentei "outDir" = "$PWD" e $outDir="$PWD" e "$outDir"=$PWD , mas nada funcionou. No entanto, echo $PWD funciona perfeitamente bem.

Por que não funciona ?

    
por Death Metal 02.11.2014 / 20:19

3 respostas

1

Parece que você está tentando atribuir $PWD a $outDir apenas no caso de $outDir não ser definido ou de valor nulo, sim?

O que se segue é equivalente, penso:

printf 'We are here: "%s"\n $outDir = "%s"\n' \ 
    "$PWD" "${outDir:=$PWD}"

Se $outDir já tiver um valor atribuído, para o segundo argumento de printf , que imprime seu valor, senão ele atribui simultaneamente o valor de $PWD a $outDir e o imprime.

É claro que, embora a chamada ${outDir:=$PWD} variable auto-corrija um valor nulo ou não definido, ele não tenta verificar se é um diretório . O mesmo acontece com o seu cheque acima. E provavelmente melhor do que qualquer um deles é:

cd -- "${outDir:=$PWD}" || exit; cd - >/dev/null

cd não apenas verificará se a seleção do usuário para $outDir está correta, mas também imprimirá um erro se não for ou não puder ser acessado pelo usuário. cd - apenas o levará de volta para onde você estava antes de testar com cd em primeiro lugar no caso de um teste bem-sucedido. O redirecionamento >/dev/null é apenas para manter cd - da impressão $PWD , o que ele fará quando usado de outra forma.

Se o usuário não atribuiu $outDir , no entanto, seu valor é atribuído apenas ao valor de $PWD como antes, o que implica um teste bem-sucedido e dois cd $PWD de comandos em sucessão, pois o - é substituído por $OLDPWD - que é aqui também $PWD .

    
por 02.11.2014 / 20:37
0
outDir="$PWD"

Além disso: parece mais útil usar echo com apenas um argumento:

echo "${PWD} ,We are here , ${outDir} , with "

O teste if pode ser substituído por

if [ -z "$outDir" ]
    
por 02.11.2014 / 20:28
0

Há uma nova linha após o primeiro comando echo, então "$outDir" = "$PWD" está sendo tratado como um comando.

Você pode acrescentar "$outDir" = "$PWD" à primeira linha de eco ou adicionar um caractere de continuação de linha no final da primeira linha de eco.

#!/usr/bin/env bash  
if [ "$outDir" == "" ]
then
    echo "$PWD" ,"We are here ", $outDir ," with ", \
    "$outDir" = "$PWD"
    echo "Yes"
fi

Ou

#!/usr/bin/env bash  
if [ "$outDir" == "" ]
then
    echo "$PWD" ,"We are here ", $outDir ," with ", "$outDir" = "$PWD"
    echo "Yes"
fi

Dará a saída desejada:

[sri@localhost ~]$ ./crap.bsh 
./crap.bsh 
/home/sri ,We are here , , with ,  = /home/sri
Yes

Aqui está o texto da minha primeira resposta. Desconsidere.

Funciona (na minha caixa) e estou chocado com isso. Primeiro aqui está o script:

#!/usr/bin/env bash
if [ "$outDir" == "" ]
then
    echo "$PWD", "We are here", $outDir, "$outDir" = "$PWD"
    echo "yes"
fi

Aqui está a saída

./test.bsh
/home/chris, We are here, ,  = /home/chris
yes

Suponho que tenha algo a ver com sua versão bash. Aqui está o meu:

bash --version
GNU bash, version 4.2.45(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

Eu escrevo scripts BASH há 20 anos e não esperava que isso funcionasse. Esse script deve ter sido escrito usando uma sintaxe que é suportada em versões mais recentes do BASH.

Eu pessoalmente teria uma string para fazer isso. Eu nunca vi ninguém fazer o que você fez antes (acho legal):

echo "$PWD, We are here, $outDir, $outDir = $PWD"

Lembre-se também de que você pode evitar a expansão de variáveis usando aspas simples:

echo "$PWD"
echo '$PWD'
echo "$(pwd)"

saída:

/home/chris
$PWD
/home/chris
    
por 03.11.2014 / 01:49