Monday, February 21, 2022

[SOLVED] Removing character from variable in BASH script

Issue

I have a script which utilises SaltStack's command-line as well as BASH commands. The script is used to gather data from multiple Linux servers (hence SaltStack), one of the checks which I would like to gather is disk space.

I have done this by using the following command:

salt $i cmd.run 'df -Ph / | tail -n1 | awk '"'"'{ print $4}'"'"'' | grep -v $i

$i = hostname and the use of the ugly '"'"' is so that my command can run via SaltStack as Salt's remote execution functionality requires single quotes around the command, if I left them in my command wouldn't run inside my BASH script.

Example syntax:

salt $hostname cmd.run 'command here'

After many questions on here and with colleagues I have this section of the script sorted. However I now the problem of stripping the output of my above command to remove the 'G' so that my script can compare the output with a threshold I have defined and turn the HTML which this script is piping to red.

Threshold:

diskspace_threshold=5

Command:

while read i ; do
diskspace=`salt $i cmd.run 'df -Ph / | tail -n1 | awk '"'"'{ print $4}'"'"'' | grep -v $i`

Validation check:

if [[ "${diskspace//G}" -lt $diskspace_threshold ]]; then
    ckbgc="red"
fi

The method I have used for stripping the G works on the command line but not within my script so it must be something to do with the syntax or just the fact that it is now within a script. Any ideas/thoughts would be helpful.

Cheers!

EDIT: Here is the error message I receive when running my script: serverdetails.sh: line 36: p : 2.8: syntax error: invalid arithmetic operator (error token is ".8")


Solution

I assume the error is coming from here (is this line 36?)

if [[ "${diskspace//G}" -lt $diskspace_threshold ]]; then

Note the error message:

serverdetails.sh: line 36: p : 2.8: syntax error: invalid arithmetic operator (error token is ".8")

bash does not do floating point arithmetic

$ [[ 2.8 -lt 3 ]] && echo OK
bash: [[: 2.8: syntax error: invalid arithmetic operator (error token is ".8")

You'll need to do something like this:

result=$( bc <<< "${diskspace%G} < $diskspace_threshold" )
if [[ $result == 1 ]]; then
  echo OK
else
  echo Boo
fi


Answered By - glenn jackman
Answer Checked By - Mary Flores (WPSolving Volunteer)