BASH unexpected EOF while looking for matching ``' [closed]

I have a BASH project for university and I have two errors that I don't understand

here is my script BASH :

#!/bin/bash proc_name=`cat /proc/cpuinfo | grep 'model name' | cut -d':' -f2 |cut -d'@' -f1 | uniq`; proc_freq=`cat /proc/cpuinfo | grep 'model name' | cut -d':' -f2 |cut -d'@' -f2 | uniq`; proc_core=`cat /proc/cpuinfo | grep 'cpu cores' | cut -d':' -f2 | uniq`; proc_hyperthreading=`cat /proc/cpuinfo | grep 'siblings' | cut -d':' -f2 | uniq`; proc_architecture=`lscpu | grep '64-bit' | cut -d',' -f2 | cut -d'-' -f1`; proc_cache_L1=`lscpu | grep 'Cache L1i' | cut -d':' -f2 | sed "s/\ \ */\ /g"`; proc_cache_L2=`lscpu | grep 'Cache L2' | cut -d':' -f2 | sed "s/\ \ */\ /g"`; proc_cache_L3=`lscpu | grep 'Cache L3' | cut -d':' -f2 | sed "s/\ \ */\ /g"`; proc_virtualisation=`lscpu | grep 'Virtualisation' | cut -d':' -f2 |sed "s/\ \ */\ /g"`; proc_load_average=`w | head -1 | cut -d" " -f12 | cut -d"," -f1-2` | tr ',' '.'` ip_infos_addr_ipv4=`/sbin/ifconfig eth0 | awk '/inet adr:/{print $2}' | awk -F ':' '{print $2}'`; ip_infos_addr_ipv6=`/sbin/ifconfig eth0 | awk '/adr inet6:/{print $3}'`; ip_publique_addr=`dig +short myip.opendns.com @resolver1.opendns.com`; carte_reseau=`lspci |grep Ethernet | cut -d":" -f3`; echo -e "$proc_name\n$proc_freq\n$proc_core\n$proc_hyperthreading\n$proc_architecture\n$proc_cache_L1\n$proc_cache_L2\n$proc_cache_L3\n$proc_virtualisation\n$proc_load_average\n$ip_infos_addr_ipv4\n$ip_infos_addr_ipv6\n$ip_publique_addr\n$carte_reseau" > Collecteur/collecteur_cpu_reseau.txt; 

And here is the two errors I have :

./collecteur_cpu_reseau: line 17: unexpected EOF while looking for matching ``' ./collecteur_cpu_reseau: line 21: syntax error: unexpected end of file 

Thanks in advance for your help

9

1 Answer

proc_load_average=`w | head -1 | cut -d" " -f12 | cut -d"," -f1-2` | tr ',' '.'` 

...needs to be...

# remove the extra backtick proc_load_average=`w | head -1 | cut -d" " -f12 | cut -d"," -f1-2 | tr ',' '.'` 

...or better...

# use parens, not backticks proc_load_average=$(w | head -1 | cut -d" " -f12 | cut -d"," -f1-2 | tr ',' '.') 

...or better...

# read the content straight from procfs without the big silly pipeline read -r loadavg_1min loadavg_5min loadavg_10min _ </proc/loadavg echo "1-minute load average: $loadavg_1min" 

That said, this script as a whole is unsalvageably awful.


For instance, consider the following alternative to all the messing around in /proc/cpuinfo:

declare -A cpuinfo=( ) # create an associative array # read line-by-line; see while IFS=$'\t:' read -r k v || [[ $k ]]; do [[ $v ]] || continue cpuinfo[$k]=${v# } # trim leading space; see done </proc/cpuinfo echo "Model name: ${cpuinfo['model name']%@*}" echo "Model freq: ${cpuinfo['model name']#*@}" echo "Actual frequency: ${cpuinfo['cpu MHz']}" echo "Siblings: ${cpuinfo['siblings']}" 

...isn't that easier? You can deploy the same strategy reading the output of a command like lscpu by substituting < <(lscpu) for </proc/cpuinfo.

You Might Also Like