Skip to content
Tools for writing ros-node-like bash scripts
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
env-hooks
test
CHANGELOG.rst
CMakeLists.txt
LICENSE
README.md
package.xml
ros_params_parser.bash

README.md

rosbash_params

Build Status

This Bash env-hook adds a "node-like" interface to your code written in Bash. The main thing it adds is ROS-like command-line parameter parsing (_param:=value), so that you can easily call the Bash script from a launch file like <node name="test" pkg="pkg" type="my_bash_script.sh"><param name="par" value="test" /></node>.

Advantages

  • Adds named parameters for Bash scripts.
    • _param:=value
  • Position of the parameters doesn't matter (though you can still easily pass positional arguments).
    • _param:=value positional_arg1 positional_arg2 _andrew:=martin
      • positional_arg1 and positional_arg2 are accessible to the script as positional args as if there were no := param mappings.
  • Super-easy parameter parsing.
    • rosbash_param var "param" "default".
  • Unified representation of bool values:
    • true, True, yes, on and 1 all translated to a single value True
    • false, false, no, off and 0 are all translated to a single value False
    • Notice: talking about exit-codes, 0 usually means success, and non-0 means failure. The unified bool representation works with the opposite meanings. So pay attention when setting bool parameters from exit-codes.
  • Can also be used standalone outside ROS pacakges.
    • You need just rospy ROS package. You don't need a ROS master (roscore) running if you don't need to access ROS param server.

Usage

Example script test_rosbash

#!/usr/bin/env bash

rosbash_init_node "node_name" "$@"  # parse the command line arguments

rosbash_param mandatory_param "param_name"  # if default value is not specified, the param is mandatory
rosbash_param optional_param "param2_name" "default_value" # optional param
rosbash_param bool_param1 "bool_name1" # bool param without default
rosbash_param bool_param2 "bool_name2" "True" # bool param with default
rosbash_param bool_param3 "bool_name3" "False" # bool param with default

echo "mandatory_param = ${mandatory_param}"  # access the parsed parameter value
echo "optional_param = ${optional_param}"  # access the parsed parameter value
echo "bool_param1 = ${bool_param1}"  # access the parsed parameter value
echo "bool_param2 = ${bool_param2}"  # access the parsed parameter value
echo "bool_param3 = ${bool_param3}"  # access the parsed parameter value

echo "rosbash_unused_argv = ${rosbash_unused_argv[@]}"  # all CLI args not parsed as a parameter

Example call:

$ ./test_rosbash _param_name:=1 _unparsed_param:=2 positional1 positional2 _bool_name1:=False
mandatory_param = 1
optional_param = default_value
bool_param1 = False
bool_param2 = True
bool_param3 = False
rosbash_unused_argv = _unparsed_param:=2 positional1 positional2

Example call with missing mandatory parameter:

$ ./test_rosbash positional1 positional2
Required parameter 'param_name' was not set.

Example call showing bool behavior

$ ./test_rosbash  _param_name:=test _bool_name1:=1 _bool_name2:=0 _bool_name3:=on
mandatory_param = test
optional_param = default_value
bool_param1 = 1  # without default value, we cannot safely convert all `1`s to `True`
bool_param2 = False  # with default value either `True` or `False`, we can convert `1` to `True` and `0` to `False`
bool_param3 = True  # `on` without quotes is always converted to `True`
rosbash_unused_argv = 

Example launch file

<launch>
    <node name="test" pkg="test_pkg" type="test_rosbash">
        <param name="param_name" value="test" />
        <param name="param2_name" value="optional" />
        <param name="bool_name1" value="off" />
    </node>
</launch>

API

rosbash_init_node

Arguments

  • rosbash_node_name Name of the "node". If __name:=name param mapping is present, it overrides this value. The node name specifies prefix of the parameters on the param server.
  • all other arguments are to be parsed as parameters (call with "$@" to pass all script args)

Global variables set by this function

  • rosbash_unused_params: associative array of parsable params on CLI that were not used by any call to rosbash_param. Keys are parameter names, values are their values.
  • rosbash_unused_argv: all arguments to this function from which no parameter was parsed (as Bash array; use arg_string="${rosbash_unused_argv[@]}" to convert to space-delimited string).
  • _rosbash_params: do not use, is private

rosbash_param

Be sure to call rosbash_init_node before calling this function!

Arguments

  • result_var The variable to store the result in (pass without dollar sign).
  • param Name of the parameter to read.
  • default [optional] The value to use when the parameter is not set. If no default is set, a missing parameter results in calling exit 1 or return 1 (depending on the value of ROS_BASH_PARAM_EXIT). To correctly convert 0 and 1 to False and True, you have to specify a default value True or False to bool params. If you don't, 0 and 1 will not be converted to their logical values.

Environment variables

  • ROS_BASH_USE_PARAM_SERVER (default true): Whether to look for parameter values to the ROS param server. Also automatically store the parsed param values to the parameter server. Set to "0" to disable.
  • ROS_BASH_USE_PARAM_VERBOSE (default false): Set to any nonempty string but "0" to enable verbose logging.
  • ROS_BASH_PARAM_EXIT (default true): If set to "0", do not call exit 1 when parameter is not found, instead call return 1, so that the calling code controls what should happen when the parameter is not found.
    • e.g. ROS_BASH_PARAM_EXIT=0 rosbash_param var "mandatory" || echo "Please, fill the mandatory param"

Other shells

As I don't use any other shells, this package only supports Bash. But theoretically it can work in many other shells, so if you want them supported, feel free to send a pull request (not issues, I won't write support for other shells myself).

You can’t perform that action at this time.