Bash Cheatsheet

function

#!/bin/bash
function f1 () {
    echo f1
}

check file

#!/bin/sh

if [ -e ~/.ssh/config ]; then
  mv ~/.ssh/config ~/.ssh/config.bak
  echo Already ~/.ssh/config was exist. rename
fi

ln -sf `pwd`/config ~/.ssh/config

引数チェック例

#!/bin/sh

if [ $# -ne 2 ]; then
	echo "invalid command syntax" 1>&2
	echo "Usage: $0 <arg0> <arg1>" 1>&2
	exit 1
fi

echo success

実行結果

$ /tmp/sh.sh slank test
success
$ /tmp/sh.sh slank test tet
invalid command syntax
Usage: /tmp/sh.sh <arg0> <arg1>

参考情報

#!/bin/sh
echo $#
while [ "$1" ]
do
    echo "$1"
    shift
done

実行結果

$ /tmp/sh.sh asf adf
2
asf
adf
$ /tmp/sh.sh asf adf sdfdf
3
asf
adf
sdfdf
count=1
count=$(expr $count + 1) # => 2

count=1
count=$((++count))    # => 2
count=$((count++))    # => 2
count=$((count += 1)) # => 3

switch

case "$var" in
  "test" ) echo "testという文字列" ;;
  a* ) echo "aで始まる文字列" ;;
  ?b* ) echo "2文字目がbの文字列" ;;
  [A-Z]* ) echo "大文字で始まる文字列" ;;
  [!xX]* ) echo "先頭がxではない文字列" ;;
  * ) echo "上記のいずれでもない文字列" ;;
esac

Completion

#!/bin/sh

function _fdk_mininet_nsenter_CONTAINER() {
	# USAGE: $0 <container-name>

	CONTAINER_NAME=$1
	docker exec $CONTAINER_NAME \
		pgrep -af "bash --norc -is mininet" \
		| awk '{print $5}' \
		| awk -F ':' '{print $2}'
}

function _fdk_nsenter() {
	local args
	case $COMP_CWORD in
	1) args=$(docker ps --format "{{.Names}}") ;;
	2) args=$(_fdk_mininet_nsenter_CONTAINER ${COMP_WORDS[1]}) ;;
	esac

	COMPREPLY=( `compgen -W "$args" -- ${COMP_WORDS[COMP_CWORD]}` )
}

function _fdk_list() {
	local args
	case $COMP_CWORD in
	1) args=$(docker ps --format "{{.Names}}") ;;
	esac

	COMPREPLY=( `compgen -W "$args" -- ${COMP_WORDS[COMP_CWORD]}` )
}

function fdk-nsenter() {
	if [ $# -ne 2 ]; then
					echo "invalid command syntax" 1>&2
					echo "Usage: $0 <container-name> <mininet-node>" 1>&2
					return 1
	fi
	PID=$(docker exec $1 pgrep -f "bash --norc -is mininet:$2")
	echo EXECUTE: docker exec -it $1 nsenter -t $PID -a bash --norc
	docker exec -it $1 nsenter -t $PID -a bash --norc
}

function fdk-list() {
	if [ $# -ne 1 ]; then
					echo "invalid command syntax" 1>&2
					echo "Usage: $0 <container-name>" 1>&2
					return 1
	fi
	docker exec $1 pgrep -af "bash --norc -is mininet:"
}

function fdk-exec-it() {
	if [ $# -lt 1 ]; then
					echo "invalid command syntax" 1>&2
					echo "Usage: $0 <container> <cmd...>" 1>&2
					return 1
	fi
	docker exec -it $*
}

function fdk-exec() {
	if [ $# -lt 1 ]; then
					echo "invalid command syntax" 1>&2
					echo "Usage: $0 <container>" 1>&2
					return 1
	fi
	docker exec $*
}

function fdk-build() {
	if [ $# -ne 1 ]; then
					echo "invalid command syntax" 1>&2
					echo "Usage: $0 <container-name>" 1>&2
					return 1
	fi
	docker exec $1 bash -c "\
		cd /root/git/frr && \
		./bootstrap.sh && \
		./configure \
			--prefix=/usr \
			--localstatedir=/var/run/frr \
			--sbindir=/usr/lib/frr \
			--sysconfdir=/etc/frr \
			--enable-vtysh \
			--enable-pimd \
			--enable-sharpd \
			--enable-multipath=64 \
			--enable-user=frr \
			--enable-group=frr \
			--enable-vty-group=frrvty \
			--enable-address-sanitizer \
			--with-pkg-extra-version=-fdk-test && \
		make -j8 clean && \
		make -j8 && \
		make -j8 install \
	"
}

function fdk-topotest() {
	if [ $# -lt 1 ]; then
					echo "invalid command syntax" 1>&2
					echo "Usage: $0 <container>" 1>&2
					return 1
	fi
	docker exec -it $1 bash -c "\
		cd /root/git/frr && \
		make -j8 && \
		make -j8 install && \
		cd /root/git/frr/tests/topotests/srv6_manager && \
		./test_srv6_manager.py $2 \
	"
}

complete -F _fdk_list    fdk-list
complete -F _fdk_list    fdk-build
complete -F _fdk_list    fdk-exec
complete -F _fdk_list    fdk-exec-it
complete -F _fdk_list    fdk-topotest
complete -F _fdk_nsenter fdk-nsenter