diff --git a/src/util b/src/util
new file mode 100644
index 0000000..333eb38
--- /dev/null
+++ b/src/util
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Utility functions/procedures
+#
+# Copyright (C) 2014 Mike Gewitz
+#
+# This file is part of shspec.
+#
+# shspec 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 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program. If not, see .
+#
+# These algorithms will often use looping constructs in favor of recursion
+# for performance reasons.
+##
+
+[ -z $__INC_UTIL ] || return
+__INC_UTIL=1
+
+
+##
+# Array functions/procedures ("a" prefix)
+#
+
+##
+# Asserts that all given values are zero
+#
+# This is perhaps mose useful for PIPESTATUS evaluation (the pipefail option
+# may not be available). If any value is non-zero, it will immediately
+# terminate with a non-zero status.
+aok()
+{
+ local -ar arr=("$@")
+ local -i i="${#arr[@]}"
+
+ while ((i--)); do
+ test "${arr[i]}" -eq 0 || return 1
+ done
+}
+
diff --git a/test/test-util b/test/test-util
new file mode 100644
index 0000000..0862915
--- /dev/null
+++ b/test/test-util
@@ -0,0 +1,60 @@
+#!/bin/bash
+# Utility function/procedure tests
+#
+# Copyright (C) 2014 Mike Gewitz
+#
+# This file is part of shspec.
+#
+# shspec 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 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program. If not, see .
+##
+
+describe aok
+ it succeeds for all zero values
+ expect aok 0
+ to succeed
+
+ expect aok 0 0 0
+ to succeed
+ end
+
+ it fails for any zero values
+ expect aok 1
+ to fail
+
+ expect aok 1 0 0
+ to fail
+
+ expect aok 0 1 0
+ to fail
+
+ expect aok 0 0 1
+ to fail
+
+ expect aok 1 1 1
+ to fail
+ end
+
+ # this surely implies a bug in the user's code
+ it fails for any non-numeric values
+ expect aok foo
+ to fail
+
+ expect aok 0 foo
+ to fail
+
+ expect aok foo 0
+ to fail
+ end
+end
+