Cisco IOS shell (IOS.sh) provides shell scripting capability to the Cisco IOS command-line-interface (CLI). Cisco IOS.sh enhances the process of controlling and configuring an IOS router using the CLI by including, variable substitution, paths, conditional statements, loops, pipes, functions, etc.
Lets cover some of the features and how we enable it, it’s disabled by default.
Prerequisites for Cisco IOS.sh
Cisco IOS Release 15.1(4)M, 15.1(2)S, and later releases.
Enabling Cisco IOS.sh
We have two methods two enable the IOS.sh feature.
1) terminal shell
2) shell processing full
When the terminal shell command is used, shell processing is not visible in the running configuration and is valid for that shell session, this provides quick and easy access to the shell commands.
Router>enable
Router# terminal shell
Router# terminal shell trace
Router# terminal no shell (disable shell processing)
To enable shell processing and access all its functions, it is recommended that you use the shell processing full command.
Router>enable
Router# conf t
Router(config)# shell processing full
Router(config)# no shell processing (disable shell processing)
After the Cisco IOS.sh is enabled, you can perform the following tasks:
- Defining and using environment variables
- Using control constructs to automate repetitive tasks
- Creating and using Cisco IOS.sh functions
- Using a new set of built-in function, that provide various text processing facilities.
- Using extended pipelines to use the output of one command as input for another one.
- Evaluating logical and arithmetic expressions for tests and variable setting.
- Using online manual pages describing these changes.
Cisco IOS.sh Variables
To create a Variable use the following syntax (no spaces are allowed)
Router# VAR1=mystring
Router# VAR1= (clear/remove value)
To view the variables and values we can use the : show shell environment command.
You can use your defined variables from the Cisco CLI for example:
R1#VAR2=helloworld
R1#echo $VAR2
helloworld
PRC Variables
There are five built-in variables that are set on command completion. These variables indicate the status of the command that was just executed.
- prc_change_mode
- prc_change_type
- prc_error_code
- prc_failure_type
- prc_ha_sync
The PRC variables contain the value of the PRC, as documented by IOS CLI documentation. In addition, the “$?” variable contains zero (0) on successful execution, and non-zero on failure. The use of the question mark is a historical precedent. Unfortunately, a question mark cannot be typed at the IOS prompt unless it is preceded by the IOS escape character ‘Ctrl-V’.
Cisco IOS.sh Control Constructs
Control constructs are used to conditionally or iteratively execute sets of commands.
- if
- for
- while
“if” Statement
An “if” statement is used to conditionally execute sets of statements. The “if” loop syntax is as follows:
if <test>
statements
elif <test>
statements
else
statements
fi
The “elif” and “else” commands are optional, and there can be multiple “elif” statements. The “end” for “if” statements is “fi” which is “if” backwards. This is done for historical reasons.
There are a set of conditional tests available for tests, which are prefixed by either “[[” or “((“. (See conditional testing below).
In addition, built-in functions or CLI commands can be used as the test, and the PRC of the command will be used to determine TRUE or FALSE.
“for” Statement
A “for” loop is a control construct that loops over a given set of values, and executes a set of statements with a riable set to each of the values in turn. Here is an example:
for x in 1 2 3
do
ping 10.10.10.$x
done
R1#
R1#for x in 1 2 3
do..done> do
do..done> ping 10.10.10.$x
do..done> done
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/5 ms
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/3 ms
“while” Statement
A ‘while” statement is used the same test syntax as an ‘if’ statement, and executes the statements in the following block until the test returns FALSE. Here is an example:
let x=0
while (( x++ < 10 )); do
echo $x
done
This will print out the numbers from 1 to 10
Loop Modifiers
Users can exit a ‘while’ or ‘for’ loop early by using a ‘break’ statement. Here is an example.
n=0
while true; do
let n++
if [[ $n -le 10 ]]; then
echo $n
else
break;
fi
done
In addition to ‘break’, the ‘continue’ statement can be used to stop executing statements in the loop, and restart the loop. A ‘while’ statement that is interrupted by a ‘continue’ will simply stop executing statements in the body of the loop and start the ‘while’ statement over again. A ‘for’ statement that is interrupted by a continue will also start over, except that it will assign the next element in the list of values before doing so.
Cisco IOS.sh Functions
IOS.sh functions enable you to define a group of commands that can be parameterized by command line arguments. The arguments passed to the IOS.sh function will be substituted for $1, $2, and so on within the body of the function. Here is an example of a user defined function:
Defining your own user functions
# helloworld example
function helloworld(){
echo helloworld
ping $1
}
Output:
R1#helloworld 10.10.10.1
helloworld
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/4 ms
To view the user defined and built-in functions we can use the following command:
show shell functions
Built-In Functions
IOS.sh has a number of complementary built-in functions that an be found in the table below:
To get more information on each of the commands use the : man option followed by the function name.
Built-in Functions | Description |
---|---|
cat | Output data from a pipe or file to the terminal |
cut | Edit piped output |
echo | Echo arguments to the terminal |
false | Return false in while or if expressions, and set the result |
fetch | Return values from the configuration database |
for | Cisco IOS.sh for loops |
grep | Search for regular expressions in piped output or files |
head | Print the first lines in the input |
interface | Print interfaces that match the argument |
let | Evaluate a numeric expression, and set the result |
man | Print information for built-ins |
more | Page piped output to the terminal |
nl | Number the lines in the input |
null | Ignore the input |
printf | Output formatted data to the terminal |
read | Read input into variables |
set_oper | Set operational values |
sleep | Pause execution of the terminal |
sort | Sort the input |
tail | Print the tail of the input |
true | Return true in while or if expressions, and set the result |
uname | Print system information |
wc | Count lines, words, and chars |
Pipes and Redirections
The IOS CLI has a facility to ‘pipe’ text from a command into a set of programs that can filter or redirect the output. The Cisco IOS.sh has expanded this facility to support more than one ‘pipe’ command on a line of input. These can be used with the built-in IOS.sh functions.
An example could look like this : show int | grep GigabitEthernet | wc -l
Same as for the bash shell article good work!