Easy program to print signal strength (RF level) returned by phone. It prints a number that you can assign to a variable or check in a conditional, e.g.:

[ $(rf_level) -lt 1 ] && echo "no signal"

Some phones have a range of -1..4 (with -1 meaning "no signal"), others have a range of 0..100 (with 0 meaning "no signal")
If you can send AT commands to your phone you can get this value using AT+CSQ but not all phones support this command and some take so long to answer to this command that communication times out if used with gnokii (LG U8120 is one that times out, you might succeed if you first send this command using minicom).

This is the same value reported by gnokii --monitor while xgnokii translates this value graphically showing 0 to 4 segments.

C source code:

/*

  $Id:$

  G N O K I I

  A Linux/Unix toolset and driver for the mobile phones.

  This file is part of gnokii.

  Gnokii is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  Gnokii is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with gnokii; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  Copyright (C) 2006 by Daniele Forsi

  Prints signal strength (not supported by all phones).

  compile with
  gcc -Wall -o rf_level rf_level.c `pkg-config --libs gnokii`

  usage:
  rf_level

  usage:
  [ $(rf_level) -lt 1 ] && echo "no signal"

*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

#include <gnokii.h>

/* prepare for i18n */
#define _(x) x

struct gn_statemachine *state;

void businit(void) {
	gn_error	error;
	
	error = gn_lib_phoneprofile_load(NULL, &state);
	if (GN_ERR_NONE == error) {
		error = gn_lib_phone_open(state);
	}
	
	if (GN_ERR_NONE != error) {
		fprintf(stderr, "%s\n", _(gn_error_print(error)));
		exit(-1);
	}
}
	
void busterminate(void) {
	gn_lib_phone_close(state);
	gn_lib_phoneprofile_free(&state);
	gn_lib_library_free();
}

void signal_handler(int signal) {
	busterminate();
	exit(-2);
}

int main(int argc, char *argv[]) {
	gn_data		data;
	gn_error	error;
	float		rflevel = -1;
	gn_rf_unit	rfunit = GN_RF_Arbitrary;

	if (argc != 1) {
		fprintf(stderr, _("Usage: %s\nPurpose: print the signal strength\n"), argv[0]);
		exit(-1);
	}

	businit();
	
	signal(SIGINT, signal_handler);

	gn_data_clear(&data);
	data.rf_level = &rflevel;
	data.rf_unit = &rfunit;

	error = gn_sm_functions(GN_OP_GetRFLevel, &data, state);
	if (error == GN_ERR_NONE) {
		printf("%d\n", (int)rflevel);
	}

	busterminate();

	exit(error);
}