Substituição de comandos no Script da Shell

0
511@ubuntu:~/Unix$ cat pass

hellounix
file1

#!/usr/bin
echo "Enter File Name"
read file
if [ -f $file ]
 then
    echo "File Found with a Name $file\n"
    echo "File Content as below\n"
    count=0
    val=0
    while read line
        do
        val=$("$line" | wc -c)
        echo "$line -->Containd $val Charecter"        
        count=$((count+1))
        done < $file
    echo "Total Line in File : $count"
else 
    echo "File Not Found check other file using running script"
fi

Saída:

511@ubuntu:~/Unix$ sh digitmismatch.sh
Enter File Name
pass
File Found with a Name pass

File Content as below

digitmismatch.sh: 1: digitmismatch.sh: hellounix: **not found**
hellounix -->Containd 0 Charecter
digitmismatch.sh: 1: digitmismatch.sh: file1: **not found**
file1 -->Containd 0 Charecter
Total Line in File : 2
==============================================================

Por que o valor de wc -c não está atribuído à variável val ?

    
por Aashish Raj 11.08.2014 / 10:26

2 respostas

1

Sua linha é:

val=$("$line" | wc -c)

Este tenta executar o comando dado por $line e executar a saída através de wc -c . A mensagem de erro exibida indica que ele está tentando executar um comando " hellounix ", como na primeira linha do seu arquivo. Se você quiser passar o valor da variável para o comando, use printf :

val=$(printf '%s' "$line" | wc -c)

Se você estiver usando o Bash, o zsh ou outro shell mais poderoso, você também pode usar aqui strings :

val=$(wc -c <<<"$line")

<<< executa a expansão na string "$line" e depois a fornece como a entrada padrão de wc -c .

Neste caso específico, no entanto, você pode usar a expansão do parâmetro do shell para obter o comprimento do valor da variável sem um pipeline:

val=${#line}

A expansão # se expande para:

String Length. The length in characters of the value of parameter shall be substituted. If parameter is '*' or '@', the result of the expansion is unspecified. If parameter is unset and set -u is in effect, the expansion shall fail.

    
por 11.08.2014 / 10:39
0
val=$("$line" | wc -c)

Esta linha significa "atribuir a saída do comando "$line" | wc -c à variável val ". Digamos que $line esteja segurando hellounix , então agora é assim:

val=$(hellounix | wc-c)

Ele está tentando executar um comando chamado hellounix , que não foi encontrado. Por isso, você está recebendo o erro hellounix: not found .

Uma correção simples seria adicionar um echo , como este:

val=$(echo -n "$line" | wc -c)

Isso "ecoará" a linha para stdout e, em seguida, a transmitirá para wc . A opção -n remove o caractere de nova linha no final da linha, porque wc conta. Se você quiser contar o caractere de nova linha no final da linha, remova a opção -n .

com echo -n :

Enter File Name
testfile
File Found with a Name testfile

File Content as below

hellounix -->Containd 9 Charecter
file1 -->Containd 5 Charecter
Total Line in File : 2

Com apenas echo :

Enter File Name
testfile
File Found with a Name testfile

File Content as below

hellounix -->Containd 10 Charecter
file1 -->Containd 6 Charecter
Total Line in File : 2
    
por 11.08.2014 / 13:09

Tags