シェル芸ブブ化

シェルスクリプトをシェル芸化(ワンライナー)するスクリプト

Installation

以下のシェルスクリプトをコピペして使ってください。とりあえず動きはする。
なんか別言語で書きなおした方がいいような気がしている。

ShellGeiBubka.sh

#!/bin/bash

# シェル芸ブブ化 ver 0.62
# kanata from https:/raintrees.net

#--------------#
# 引数チェック #
#--------------#
if [ -r "${1}" ]
then
  :
else
  echo "file can not open. [$1]"
  exit 1
fi

#------------------------------------------------------------#
# 処理中に出現する引数の対応(置換)                           #
# →しんどいので、とりあえずやめる                           #
# 例えば、echo $1 |awk '{print $1}' のパターンが解決できない #
#------------------------------------------------------------#
if cat "${1}"|grep -e '\$[1-9]' -e '\${[1-9]' >/dev/null
then
  echo "#------------------------------------------------------------------------------#"
  echo "#                             シェル芸ブブ化(注意)                             #"
  echo "#------------------------------------------------------------------------------#"
  echo '# シェルスクリプトの中に、引数($1 .. $9)の処理をしている箇所があります。'
  echo "# シェル芸は引数が使えませんので、変換後の結果に対して手動にて修正してください。"
  echo "# 中断する場合は、[Ctrl + c]にて中止してください。"
  echo "#-------------------------------------------------------------------------------"
  cat "${1}"|nl|grep -e '\$[1-9]' -e '\${[1-9]' |grep -v '^\s*[0-9]*\s*#'|sed 's/^/# /g'
  echo "#-------------------------------------------------------------------------------"
  echo "# Prease puress [Enter]"
  read DUMMY
fi
#ARG1=`echo "$2"|sed 's@/@\\\\/@g'`
#ARG2=`echo "$3"|sed 's@/@\\\\/@g'`
#ARG3=`echo "$4"|sed 's@/@\\\\/@g'`
#ARG4=`echo "$5"|sed 's@/@\\\\/@g'`
#ARG5=`echo "$6"|sed 's@/@\\\\/@g'`
#ARG6=`echo "$7"|sed 's@/@\\\\/@g'`
#ARG7=`echo "$8"|sed 's@/@\\\\/@g'`
#ARG8=`echo "$9"|sed 's@/@\\\\/@g'`
#ARG9=""
#ARG_SH="1"

#------------------------------#
# 処理中に出現し得るexitの代替 #
#------------------------------#
EXIT='echo "This ShellGei run exit. Press [Ctrl + c]";read DUMMY'

#--------#
# 主処理 #
#--------#

SHELLSCRIPT="$1"
while read LINE
do
  # 空行を削除
  if echo ${LINE}|grep -e '^\s*#' -e '^\s*$' >/dev/null
  then
    continue
  fi

  # シェバンとコメント行を無視
  if echo ${LINE} |grep -e '^\s*#' >/dev/null
  then
    continue
  fi

  # exitを置換
  if echo ${LINE} |grep -e '^\s*exit' >/dev/null
  then
    LINE=`echo ${LINE}|sed "s/exit \+[0-9]\+/${EXIT}/g"`
  fi

  # 特殊なシェル変数を置換
  #  LINE=`echo ${LINE}|sed 's/\${@}/\$@/g' |sed 's/\$@/____ARG____/g'|sed 's/____ARG____/\$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9/g'`
  #  LINE=`echo ${LINE}|sed 's/\${#}/\$#/g' |sed 's/\$#/____ARG____/g'|sed "s/____ARG____/${ARG_SH}/g"`

  # 引数を置換
  #if echo ${LINE}|grep -e '\$[1-9]' -e '\${[1-9]' >/dev/null
  #then
  #  LINE=`echo ${LINE}|sed 's/\${1}/\$1/g' |sed 's/\$1/____ARG____/g'|sed "s/____ARG____/${ARG1}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${2}/\$2/g' |sed 's/\$2/____ARG____/g'|sed "s/____ARG____/${ARG2}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${3}/\$3/g' |sed 's/\$3/____ARG____/g'|sed "s/____ARG____/${ARG3}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${4}/\$4/g' |sed 's/\$4/____ARG____/g'|sed "s/____ARG____/${ARG4}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${5}/\$5/g' |sed 's/\$5/____ARG____/g'|sed "s/____ARG____/${ARG5}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${6}/\$6/g' |sed 's/\$6/____ARG____/g'|sed "s/____ARG____/${ARG6}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${7}/\$7/g' |sed 's/\$7/____ARG____/g'|sed "s/____ARG____/${ARG7}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${8}/\$8/g' |sed 's/\$8/____ARG____/g'|sed "s/____ARG____/${ARG8}/g"`
  #  LINE=`echo ${LINE}|sed 's/\${9}/\$9/g' |sed 's/\$9/____ARG____/g'|sed "s/____ARG____/${ARG9}/g"`
  #fi

  # then,else,doの末尾には;を付けない
  if echo ${LINE} |grep -e '\s*then\s*$' -e '\s*else\s*$' -e '\s*do\s*$' >/dev/null
  then
    printf "%s " "${LINE}"
  else
    printf "%s ; " "${LINE}"
  fi
done < $SHELLSCRIPT

echo
exit 0

Usage

$ ShellGeiBubka.sh [変換したいシェルスクリプト] 

実行例

$ ShellGeiBubka.sh example.sh

Specification

以下は、単純に未対応

  • 関数の変換に未対応
  • case文の変換に未対応

そして、シェル芸はシェルスクリプトと比べて意外に制限があることが解る。

  • IFS変数に改行のみを設定しているスクリプトはうまく変換できない(どうしようもない)。
  • 引数($1 .. $9)は、変換後に手修正が必要

本当は、自動で埋め込もうと思ったんだけど、これがまぁ、めんどくさいことになってて、、
echo $1 |awk '{print $1}' とかあると動かない($1を誤変換する。awkの$1は変換したくない)。
特殊なシェル変数($$ $# $@ など)も取り扱いをどうするか悩む。

ここらへん、シェル芸勉強会で発表したいぐらい。

Background

何故作ったか

上田先生主催のシェル芸勉強会をちょくちょく拝見するも、「1行で出来ないわコレ・・・」という挫折感を味わう。

そうや・・・シェルスクリプト作ってから1行にすればいいんや・・・と思いたつ←いまココ

しかし、まぁ、なんだな。シェル芸の美学に反するような気がしないでもない。

名前の由来

ある日突然、降りてきた。
しかしググると、もう既に発言している人がいた。僕だけじゃなかった。

参考:セルゲイ・ブブカ

クリップボードから画像を追加 (サイズの上限: 100 MB)