echo $ junto com variável

1

Estou tentando imprimir o último diretório como abaixo

#!/bin/bash
dirc="/a/b/"
i=3  
'echo "$dirc" | awk -F / '{ print ""$"i"}''

que deve imprimir 'b', o que não está acontecendo.

    
por Srikanth Yadake 16.06.2017 / 09:26

3 respostas

3

i no script AWK é uma variável AWK, não uma variável shell; você precisa definir a variável AWK:

#!/bin/bash
dirc="/a/b/"
echo "${dirc}" | awk -F / -v i=3 '{print $i}'

Você pode especificar o valor de i de qualquer maneira que o shell entenda:

i=3
echo "${dirc}" | awk -F / -v "i=${i}" '{print $i}'

Você poderia também obter o shell para avaliar a variável no script AWK, mas isso está apenas procurando por problemas:

i=3
echo "${dirc}" | awk -F / "{print \$${i}}"
    
por 16.06.2017 / 09:37
2

Você pode usar as operações de string do shell para obter a última parte do diretório sem invocar um utilitário externo:

dirc="/a/b/"
dirc=${dirc%/}         # remove trailing / if it is there
echo "${dirc##*/}"     # remove everything up to the last /

Quais são as saídas de b . Observe que isso não funcionará se dirc for apenas / , então basename pode ser melhor.

Ou obtenha um campo por número, por meio de um array de shell .

IFS=/ read -a dira <<< "$dirc"   # split to an array
echo "${dira[2]}"                # echo one field, first is 0

Como um aparte, certamente os backticks em seu comando echo | awk são um erro de digitação? Com eles, o shell pegaria a saída do awk como um comando para executar.

    
por 16.06.2017 / 10:41
1

Para imprimir a última parte do caminho, use basename :

$ dirc='/a/b/'
$ basename "$dirc"
b

Para obter o campo / -delimited usando awk , defina uma variável awk , var , por exemplo, como o valor de $i e, em seguida, use $var in awk para acessar o campo i:

$ i=3
$ echo "$dirc" | awk -v var="$i" -F '/' '{ print $var }'
b

A diferença entre var e $var em awk é que var é um valor numérico (neste caso) enquanto $var é o valor do campo correspondente a esse valor numérico.

Como ilkkachu observou, os backticks em torno da última linha do seu código não fazem sentido. Isso fará com que o resultado do comando (a string b ) seja interpretado como um comando que será executado.

    
por 16.06.2017 / 09:41