この記事は約14分3秒で読むことができます。

asciiコード定義ファイルからasciiコード定義確認スクリプトを作ってみた話

まえがき

本当は自己収束型のシェルスクリプトを目指していたんだけど、脱線しすぎた。自己収束型っていうのは頭の中のイメージ。まだうまく言葉で表現できていないや。

参考文献

ASCII / ISO 8859-1 (Latin-1) Table with HTML Entity Names  

______$(echo -e ‘\U1F4A9’)______.sh

コード表示

#!/bin/bash

_insert_shebang(){
  FILE_NM=$1
  sed -i '1i#!/bin/bash\n' ${FILE_NM}
}

_grt_exec_priv(){
  FILE_NM=$1
  #echo -n "password:"
  read -s password echo ${password} | sudo -S chmod +x ${FILE_NM}
}

_exec(){
  FILE_NM=$1
  source ${FILE_NM}
}

_trap_rm_tmpdir(){
  local TMP_DIR=$1
  trap "rm -rf ${TMP_DIR}" EXIT
}

_clean(){
  local FNM=$1
  rm -f "${FNM}"
}

_def_ascii_code(){
  local FNM=$1
cat <<EOF >${FNM}
32&47
58&64
91&96
123&126
EOF
}

_def_ascii_cnst(){
  local FNM=$1
cat <<EOF >${FNM}
LNF='x0a'
SPA='x20'
ECM='x21'
DQT='x22'
NSG='x23'
DLR='x24'
PCT='x25'
AMP='x26'
SQT='x27'
LPS='x28'
RPS='x29'
AST='x2a'
PLS='x2b'
CNM='x2c'
PYN='x2d'
DOT='x2e'
SLS='x2f'
CLN='x3a'
SCN='x3b'
LTS='x3c'
EQL='x3d'
GTS='x3e'
QES='x3f'
ATM='x40'
LSB='x5b'
BSL='x5c'
RSB='x5d'
CLT='x5e'
USC='x5f'
BQT='x60'
LCB='x7b'
VTB='x7c'
RCB='x7d'
TLD='x7e'
EOF
}

_pre_prc(){
  local IPUT=$1
  sed -e '/^#!/d' -e '/^$/d' <<<${IPUT}
}

_mk_func_frame(){
  local FNM=$1
cat <<EOF >${FNM}
#!/bin/bash

source ./${SRC_FNM}

_f(){
  echo "" | awk '{
    @
  }'
}

_f
EOF
}

_mk_call_ascii_cnst(){
  local SRC_FNM=$1
  local TGT_FNM=$2
  local IPUT=$(while read LN;do
    local LFT=${LN%=*}
    _pre_prc ${LFT}
  done < <(cat ${SRC_FNM}))
  local TMP_DIR=$(mktemp -d)
  _trap_rm_tmpdir ${TMP_DIR}
  echo "${IPUT}" >${TMP_DIR}/tmp
  local BUILD_CMD=$(while read LN;do
    RN=$(echo ${LN} | sed -e 's/ .*//');
    ASCII_NM=$(echo ${LN} | sed -e 's/.* //');
    echo "" | awk '
    BEGIN{
      RN="'${RN}'"
      ASCII_NM="'${ASCII_NM}'"
      DLR="\'${DLR}'"
      SPA="\'${SPA}'"
      LCB="\'${LCB}'"
      RCB="\'${RCB}'"
      BSL="\'${BSL}'"
      EQL="\'${EQL}'"
      DQT="\'${DQT}'"
      SQT="\'${SQT}'"
      LNF="\'${LNF}'"
    }
    {
      print ASCII_NM""EQL""DQT""BSL""BSL""BSL""SQT""DLR""LCB""ASCII_NM""RCB""SQT""DQT""LNF"""print"SPA""ASCII_NM""
    }
    '
  done < <(cat ${TMP_DIR}/tmp | nl))
  BUILD_CMD=$(echo "${BUILD_CMD}" | sed ':a;N;$!ba;s/\n/@/g')
  sed -i -e 's:@:'"$BUILD_CMD"':g' ${TGT_FNM}
  cat ${TGT_FNM} | tr '@' '\n' >${TMP_DIR}/tmpp
  cp ${TMP_DIR}/tmpp ${TGT_FNM}
}

_main(){
  SRC_FNM=$1
  TGT_FNM=$2
  source ./${SRC_FNM}
  _clean ${SRC_FNM}
  _def_ascii_cnst ${SRC_FNM}
  _insert_shebang ${SRC_FNM}
  _grt_exec_priv ${SRC_FNM}
  _clean ${TGT_FNM}
  _mk_func_frame ${TGT_FNM}
  _mk_call_ascii_cnst ${SRC_FNM} ${TGT_FNM}
  _grt_exec_priv ${TGT_FNM}
  _exec ${TGT_FNM}
}

_main def_ascii_cnst.sh call_ascii_cnst.sh

実行例


[oracle@centos rr]$ ll
合計 48
-rw-r--r--. 1 oracle docker   95  6月 10 00:42 README.md
-rw-r--r--. 1 oracle docker  965  6月 14 19:49 call_ascii_cnst.sh
drwxr-xr-x. 3 oracle docker 4096  6月  9 18:28 cnst
-rw-r--r--. 1 oracle docker  353  6月 14 20:00 def_ascii_cnst.sh
drwxr-xr-x. 4 oracle docker 4096  6月  9 18:28 func
drwxr-xr-x. 2 oracle docker 4096  6月  9 18:28 iput
drwxr-xr-x. 5 oracle docker 4096  6月 10 21:26 main
-rwxr-xr-x. 1 oracle docker 1160  6月 13 07:33 t.sh
drwxr-xr-x. 5 oracle docker 4096  6月 14 14:24 test
-rwxr-xr-x. 1 oracle docker 4228  6月 14 19:50 tt.sh
drwxr-xr-x. 2 oracle docker 4096  6月 13 07:23 util
[oracle@centos rr]$ vi ______$(echo -e '\U1F4A9')______.sh
[oracle@centos rr]$ ll
合計 52
-rw-r--r--. 1 oracle docker   95  6月 10 00:42 README.md
-rw-r--r--. 1 oracle docker 2435  6月 14 20:02 ______?______.sh
-rw-r--r--. 1 oracle docker  965  6月 14 19:49 call_ascii_cnst.sh
drwxr-xr-x. 3 oracle docker 4096  6月  9 18:28 cnst
-rw-r--r--. 1 oracle docker  353  6月 14 20:00 def_ascii_cnst.sh
drwxr-xr-x. 4 oracle docker 4096  6月  9 18:28 func
drwxr-xr-x. 2 oracle docker 4096  6月  9 18:28 iput
drwxr-xr-x. 5 oracle docker 4096  6月 10 21:26 main
-rwxr-xr-x. 1 oracle docker 1160  6月 13 07:33 t.sh
drwxr-xr-x. 5 oracle docker 4096  6月 14 14:24 test
-rwxr-xr-x. 1 oracle docker 4228  6月 14 19:50 tt.sh
drwxr-xr-x. 2 oracle docker 4096  6月 13 07:23 util
[oracle@centos rr]$ ./______$(echo -e '\U1F4A9')______.sh
bash: ./______💩______.sh: 許可がありません
[oracle@centos rr]$ chmod +x ______$(echo -e '\U1F4A9')______.sh
[oracle@centos rr]$ ll
合計 52
-rw-r--r--. 1 oracle docker   95  6月 10 00:42 README.md
-rwxr-xr-x. 1 oracle docker 2435  6月 14 20:02 ______?______.sh
-rw-r--r--. 1 oracle docker  965  6月 14 19:49 call_ascii_cnst.sh
drwxr-xr-x. 3 oracle docker 4096  6月  9 18:28 cnst
-rw-r--r--. 1 oracle docker  353  6月 14 20:03 def_ascii_cnst.sh
drwxr-xr-x. 4 oracle docker 4096  6月  9 18:28 func
drwxr-xr-x. 2 oracle docker 4096  6月  9 18:28 iput
drwxr-xr-x. 5 oracle docker 4096  6月 10 21:26 main
-rwxr-xr-x. 1 oracle docker 1160  6月 13 07:33 t.sh
drwxr-xr-x. 5 oracle docker 4096  6月 14 14:24 test
-rwxr-xr-x. 1 oracle docker 4228  6月 14 19:50 tt.sh
drwxr-xr-x. 2 oracle docker 4096  6月 13 07:23 util
[oracle@centos rr]$ ./______$(echo -e '\U1F4A9')______.sh | nl
[sudo] oracle のパスワード:
[sudo] oracle のパスワード:
       
       
     1	 
     2	!
     3	"
     4	#
     5	$
     6	%
     7	&
     8	'
     9	(
    10	)
    11	*
    12	+
    13	,
    14	-
    15	.
    16	/
    17	:
    18	;
    19	<
    20	=
    21	>
    22	?
    23	@
    24	[
    25	\
    26	]
    27	^
    28	_
    29	`
    30	{
    31	|
    32	}
    33	~
[oracle@centos rr]$ 

あとがき

ファイル名にうんこが描けたのが収穫。awkはエスケープ専門で使ったらよさそうかな。使い易い。さて、ランニングするぞー!fin。

Leave a Reply

Your email address will not be published. Required fields are marked *