--- /dev/null
+#!/bin/bash
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
+
+# Copyright 2024 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+appu() {
+ local help="Usage: appu [-h|--help|-v] FILE [LINE]
+Append unique: Appends line(s) to FILE if they are not already in FILE.
+
+If no LINE is specified, process each line from STDIN.
+
+Appu is like ainsl, but with plain verbatim strings and no automatic
+escaping.
+
+-v verbose. Prints each line added to the file.
+-h|--help display this message
+"
+ local verbose=false
+
+ if ! temp=$(getopt -l help: hv "$@"); then
+ echo "appu: unexpected options."
+ echo "$help"
+ return 1
+ fi
+ eval set -- "$temp"
+ while true; do
+ case $1 in
+ -v[) verbose=true ;;
+ -h|--help)
+ echo "$help"
+ return 0
+ ;;
+ --) shift; break ;;
+ *) echo "$0: Internal error! unexpected args: $*" ; return 1 ;;
+ esac
+ shift
+ done
+
+ if (( ${#@} == 0 )) ; then
+ echo "appu error: need 1 or more arguments"
+ echo "$help"
+ return 1
+ fi
+ file="$1"
+ shift
+ local MAPFILE
+ if [[ $1 ]]; then
+ MAPFILE=("$@")
+ else
+ mapfile -t
+ fi
+ for line in "${MAPFILE[@]}"; do
+ if $verbose; then
+ grep -xFq "$line" "$file" &>/dev/null || tee -a "$file" <<<"$line"
+ else
+ grep -xFq "$line" "$file" &>/dev/null || printf "%s\n" "$line" >>"$file"
+ fi
+ done
+ return 0
+}
+appu "$@"
+++ /dev/null
-#!/bin/bash
-# I, Ian Kelling, follow the GNU license recommendations at
-# https://www.gnu.org/licenses/license-recommendations.en.html. They
-# recommend that small programs, < 300 lines, be licensed under the
-# Apache License 2.0. This file contains or is part of one or more small
-# programs. If a small program grows beyond 300 lines, I plan to switch
-# its license to GPL.
-
-# Copyright 2024 Ian Kelling
-
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-teeu() {
- local help="Usage: teeu [-h|--help] FILE [LINE]
-Append LINE if it's not already in FILE
-
-If no LINE is specified, process each line from STDIN.
-teeu is short for tee unique.
-
--h|--help display this message"
-
- if [[ $1 == --help || $1 == -h ]]; then
- echo "$help"
- return
- fi
-
- if (( ${#@} == 0 )) ; then
- echo "teeu error: need 1 or more arguments"
- echo "$help"
- return 1
- fi
- file="$1"
- shift
- local MAPFILE
- if [[ $1 ]]; then
- MAPFILE=("$*")
- else
- mapfile -t
- fi
- for line in "${MAPFILE[@]}"; do
- grep -xFq "$line" "$file" &>/dev/null || tee -a "$file" <<<"$line"
- done
- return 0
-}
-teeu "$@"