Bash-common-checks: Difference between revisions

From I Will Fear No Evil
Jump to navigation Jump to search
 
Line 180: Line 180:
     If the function is called with an argument, return the value of that argument.
     If the function is called with an argument, return the value of that argument.
     If no argument is provided, return 0.
     If no argument is provided, return 0.
</pre>
====Count number of occurrences of a specific character====
A nice simple way to count in this case the number of periods in a variable.  I like this more than some of the other solutions I have seen.
<pre>
VALUE="this.is.a.test.string"
DOTS="${VALUE//[^.]/}"
echo "${#DOTS}"
4
</pre>
</pre>
[[Category: Bash]]
[[Category: Bash]]

Latest revision as of 08:30, 29 September 2026

Common checks and validations that are a PITA to remember

Is Integer?

  • Check if a var is an integer
  • support negative as well as positive integer values using extended regex
VAR=123
if [[ ${VAR} =~ ^-?[0-9]+$ ]]; then
  echo "Is integer"
else
  echo "Is not integer"
fi

TCP port check

  • leverage /dev
  • use timeout for sanity
  • Use for any kind of TCP knock
  • do not use FQDN, go by IP
IP=192.168.15.100
timeout 1 bash -c "</dev/tcp/${IP}/22"
if [[ $? -ne 0 ]]; then
  echo "ssh port closed at $IP"
else
  echo "ssh port open at $IP"
fi

Find what using inodes

  • use sudo if you are going against /
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

Make a banner

skull(){
cat << EIEIO
*************************************************************
*                                                           *
*   .=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-.      *
*   |                     ______                     |      *
*   |                  .-"      "-.                  |      *
*   |                 /            \                 |      *
*   |     _          |              |          _     |      *
*   |    ( \         |,  .-.  .-.  ,|         / )    |      *
*   |     > "=._     | )(__/  \__)( |     _.=" <     |      *
*   |    (_/"=._"=._ |/     /\     \| _.="_.="\_)    |      *
*   |           "=._"(_     ^^     _)"_.="           |      *
*   |               "=\__|IIIIII|__/="               |      *
*   |              _.="| \IIIIII/ |"=._              |      *
*   |    _     _.="_.="\          /"=._"=._     _    |      *
*   |   ( \_.="_.="     '--------'     "=._"=._/ )   |      *
*   |    > _.="                            "=._ <    |      *
*   |   (_/                                    \_)   |      *
*   |                                                |      *
*   '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-='      *
*                                                           *
*                   Abandon All Hope                        *
*************************************************************/
EIEIO
}
# abandon all hope ye who enter here
skull

Create a CRC16 against string

  • use caution in creating unique values < 65k, as there can be slop and overlap
  • Good quick and dirty creation that is reproducible
STRING=foo
crc16() {
    while read -r -d "" -n 1 ; do astring+=( "$REPLY" ) ; done <<< "$1"
    cnt=${#1}
    c=65535
    for ((x=0;x<$cnt;x++)); do
        char=$(printf '%d' \'"${1:$x:1}")
        e=$(((c ^ char) & 0x00FF))
        s=$(((e << 4) & 0x00FF))
        f=$(((e ^ s) & 0x00FF))
        r1=$(((c >> 8) ^ (f << 8) ^ (f << 3) ^ (f >> 4)))
        c=$r1
    done
    c=$((c ^ 0xffff))
    echo "$c"
}
crc16 ${STRING}
returns value 26676

Generate random string

  • Great for creating a password
  • no reserved chars get generated
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 20 | tr -d '\n'

Create CRC32 from string

  • just to be complete... :)
crc32 <(echo "LongString")
1624d322

Generate HEX for string

  • Note this is not able to do the reverse
  • No found method to convert the output back to LongString so this is buggy
echo -n "LongString"  | cksum | cut -d " "  -f1 | xargs echo printf '%0X\\n' | sh
5751BDB2

Convert first letter to Upper case

  • PROJECT=testproject
PROJECT="$(tr '[:lower:]' '[:upper:]' <<< ${PROJECT:0:1})${PROJECT:1}" 
echo ${PROJECT}
Testproject

Using tr, this will make the first letter always upper case and ignore the
remainder of the string

Make leading zeros for output

  • make 2 say 02 instead
  • change the % values for things such as decimal precision or more leading numbers
$(printf "%02d" 2)
02

Stupid loop I keep forgetting

Used for renaming television episodes when what you think is a season does not match what tbdb thinks is a season

 for x in $(seq 1 12); do z=$(( $x + 12 )); y=$(printf "%02d" $x) ; s2='s02e' ; s1='s01e'; if=$(ls ./*$s2$y*) ; fn=$(echo $if | sed "s/$s2$y/$s1$z/") ; mv $if $fn ; done

Function return code examples

Stack Overflow source

#!/bin/bash -e
function func1() {
   return ${1:-0}
}

function func2() {
   local RVAL=""
   RVAL=$(func1 ${1:-0} && echo 0 || echo $?)
   if [[ $RVAL != "0" ]]; then
      echo "Some logic on exit code $RVAL"
      exit $RVAL
   fi
   echo "Some logic on exit code 0"
}

func2 ${1:-0}
Some basic tests

$ ./test.sh
Some logic on exit code 0
$ echo $?
0
$ ./test.sh 128
Some logic on exit code 128
$ echo $?
128

Definition for parameter expansion

In Bash, the syntax return ${1:-0} is a way to return a value from a function, with a default value if the first argument ($1) is not provided. Here's a breakdown of the components:

    ${1:-0}:
        ${1} refers to the first positional parameter passed to the script or function.
        :- is a parameter expansion operator that provides a default value.
        0 is the default value.

    Therefore, ${1:-0} means "use the value of the first argument if it's provided; otherwise, use 0."

    return:
        This command is used within a function to return an exit status. The exit status is a numeric value (0-255) that indicates success (0) or failure (non-zero).

Putting it all together, return ${1:-0} means:

    If the function is called with an argument, return the value of that argument.
    If no argument is provided, return 0.

Count number of occurrences of a specific character

A nice simple way to count in this case the number of periods in a variable. I like this more than some of the other solutions I have seen.

VALUE="this.is.a.test.string"
DOTS="${VALUE//[^.]/}"
echo "${#DOTS}"
4