Skip to content

Instantly share code, notes, and snippets.

@td-shi
Last active July 31, 2021 00:43
Show Gist options
  • Save td-shi/cee8c104b398ed1aa33bcc1305f85c96 to your computer and use it in GitHub Desktop.
Save td-shi/cee8c104b398ed1aa33bcc1305f85c96 to your computer and use it in GitHub Desktop.
The lid.sh generate 9-character random and based date string.
#!/bin/sh
# -*- coding:utf-8 posix -*-
# === Coding shell scripting Memo ==============================================
# ${<name>#<pattern>} :: matching delete with shortest by forword.
# ${<name>##<pattern>} :: matching delete with longest by forword.
# ${<name>%<pattern>} :: matching delete with shortest by backword.
# ${<name>%%<pattern>} :: mathing delete with longest by backword.
# ${<name>/<before>/<after>} :: replace only first matching.
# ${<name>//<before>/<after>} :: replace all matching.
# ${<name>:-<value>} :: if no yet set value, return value.
# ${<name>:=<value>} :: if no yet set value, return value and set.
# ". <shell script>" is to keep current shell and take over environment.
# === Initialize shell environment =============================================
#set -u # Just stop undefined values.
#set -e # Just stop error.
#set -x # Debug running command.
umask 0022
export LC_ALL=C
export LANG=C
PATH="$(command -p getconf PATH 2>/dev/null)${PATH+:}${PATH-}"
case $PATH in :*) PATH=${PATH#?};; esac
export PATH # or PATH="<add dir>${PATH+:}${PATH-}"
export UNIX_STD=2003 # to make HP-UX conform to POSIX
# === Define the functions for printing usage and error message ================
usage_and_exit(){
cat <<-"USAGE" 1>&2
# About
The lid.sh generate a 9-character id string. It is base64 url safe.
4 character (24bit) are random from "/dev/urandom". 3 other character are year,
and 2 the others are passed date in year.
# Usage
## Command
lid.sh [options]
## Options
- -h |--help |--version
+ This help.
# Version
2021-07-31 0.03
# LICENSE
[CC0(Public domain)](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
# Author
2021 TD
USAGE
exit 1
}
error_exit() {
${2+:} false && echo "${0##*/}: $2" 1>&2
exit "$1"
}
# === Initialize parameters ====================================================
SED_LF=$(printf '\\\n_')
SED_LF=${SED_LF%_}
POST1=$(date -u "+%Y")
POST2=$(date -u "+%j")
# === Confirm that the required commands exist =================================
# === Print usage and exit if one of the help options is set ===================
case "$# ${1:-}" in
'1 -h'|'1 --help'|'1 --version') usage_and_exit;;
esac
# === Read options =============================================================
while :; do
case "${1:-}" in
--|-)
break
;;
-p1)
POST1="${2}"
shift 2
;;
-p2)
POST2="${2}"
shift 2
;;
--*|-*)
error_exit 1 'Invalid option.'
;;
*)
break
;;
esac
done
# === Require parameters check =================================================
# === Last parameter ===========================================================
# === Define funcitons =========================================================
# === Main routine =============================================================
# hexdump -e '1/4 " %011o" "\n"' -v /dev/urandom
# od -A n -t o4 -v -N 3 /dev/urandom
printf "%06o%04o%s\n" $(( POST1 )) $(( POST2 )) "$(od -A n -t o4 -v -N 3 /dev/urandom | sed "s/^ 000//")" |\
sed "s/0/</g" |\
sed "s/1/001/g" |\
sed "s/2/010/g" |\
sed "s/3/011/g" |\
sed "s/4/100/g" |\
sed "s/5/101/g" |\
sed "s/6/110/g" |\
sed "s/7/111/g" |\
sed "s/</000/g" |\
sed "s:......: &:g" |\
sed "s:111111:_:g" |\
sed "s:111110:-:g" |\
sed "s:111101:9:g" |\
sed "s:111100:8:g" |\
sed "s:111011:7:g" |\
sed "s:111010:6:g" |\
sed "s:111001:5:g" |\
sed "s:111000:4:g" |\
sed "s:110111:3:g" |\
sed "s:110110:2:g" |\
sed "s:110101:1:g" |\
sed "s:110100:0:g" |\
sed "s:110011:z:g" |\
sed "s:110010:y:g" |\
sed "s:110001:x:g" |\
sed "s:110000:w:g" |\
sed "s:101111:v:g" |\
sed "s:101110:u:g" |\
sed "s:101101:t:g" |\
sed "s:101100:s:g" |\
sed "s:101011:r:g" |\
sed "s:101010:q:g" |\
sed "s:101001:p:g" |\
sed "s:101000:o:g" |\
sed "s:100111:n:g" |\
sed "s:100110:m:g" |\
sed "s:100101:l:g" |\
sed "s:100100:k:g" |\
sed "s:100011:j:g" |\
sed "s:100010:i:g" |\
sed "s:100001:h:g" |\
sed "s:100000:g:g" |\
sed "s:011111:f:g" |\
sed "s:011110:e:g" |\
sed "s:011101:d:g" |\
sed "s:011100:c:g" |\
sed "s:011011:b:g" |\
sed "s:011010:a:g" |\
sed "s:011001:Z:g" |\
sed "s:011000:Y:g" |\
sed "s:010111:X:g" |\
sed "s:010110:W:g" |\
sed "s:010101:V:g" |\
sed "s:010100:U:g" |\
sed "s:010011:T:g" |\
sed "s:010010:S:g" |\
sed "s:010001:R:g" |\
sed "s:010000:Q:g" |\
sed "s:001111:P:g" |\
sed "s:001110:O:g" |\
sed "s:001101:N:g" |\
sed "s:001100:M:g" |\
sed "s:001011:L:g" |\
sed "s:001010:K:g" |\
sed "s:001001:J:g" |\
sed "s:001000:I:g" |\
sed "s:000111:H:g" |\
sed "s:000110:G:g" |\
sed "s:000101:F:g" |\
sed "s:000100:E:g" |\
sed "s:000011:D:g" |\
sed "s:000010:C:g" |\
sed "s:000001:B:g" |\
sed "s:000000:A:g" |\
tr -d " "
# === End shell script =========================================================
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment