全部博文(106)
分类: LINUX
2013-08-17 01:16:28
作者是一位Shell脚本迷,他对有关Shell脚本新奇有趣的东西是如此的痴迷。最近他遇到了authy-ssh脚本,为了缓解ssh服务器双重认证问题,他学到了许多有用且很酷的东西。对此,他想分享给大家。
一、Colors your echo
大多数情况下,你希望输出echo Color,比如绿色代表成功,红色代表失败,黄色代表警告。
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
|
NORMAL=$(tput sgr0)
GREEN=$(tput setaf 2; tput bold)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)
function red() {
echo -e "$RED$*$NORMAL"
}
function green() {
echo -e "$GREEN$*$NORMAL"
}
function yellow() {
echo -e "$YELLOW$*$NORMAL"
}
# To print success
green "Task has been completed"
# To print error
red "The configuration file does not exist"
# To print warning
yellow "You have to use higher version."
|
二、To print debug information (打印调试信息)
打印调试信息只需调试设置flag。
1
2
3
4
5
6
7
8
9
|
function debug() {
if [[ $DEBUG ]]
then
echo ">>> $*"
fi
}
# For any debug message
debug "Trying to find config file"
|
1
2
3
|
# From cool geeks at hacker news
function debug() { ((DEBUG)) && echo ">>> $*"; }
function debug() { [ "$DEBUG" ] && echo ">>> $*"; }
|
1
2
3
4
5
6
7
8
9
10
11
12
|
OK=0
FAIL=1
function require_curl() {
which curl &>/dev/null
if [ $? -eq 0 ]
then
return $OK
fi
return $FAIL
}
|
有些极客会建议直接通过返回which来返回代码。
1
2
3
|
# From cool geeks at hacker news
function require_curl() { which "curl" &>/dev/null; }
function require_curl() { which -s "curl"; }
|
当我开始编写shell 脚本,我会用echo来命令打印已使用的脚本。当有大量的文本在使用时, echo命令会变得凌乱,那么可以利用cat来设置命令。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
cat << EOF
Usage: myscript
VERSION: 1.0
Available Commands
install - Install package
uninstall - Uninstall package
update - Update package
list - List packages
EOF
|
五、User configured value vs Default value (用户配置值VS 默认值)
有时,如果用户没有设置值,那么会使用默认值。
1
|
URL=${URL:-}
|
六、To check the length of the string 检查字符串长度
1
2
3
4
5
|
if [ ${#authy_api_key} != 32 ]
then
red "you have entered a wrong API key"
return $FAIL
fi
|
利用 ${#VARIABLE_NAME} 定义变量值的长度。
七、To read inputs with timeout (读取输入超时)
1
2
3
4
5
6
7
8
|
READ_TIMEOUT=60
read -t "$READ_TIMEOUT" input
# if you do not want quotes, then escape it
input=$(sed "s/[;\`\"\$\' ]//g" <<< $input)
# For reading number, then you can escape other characters
input=$(sed 's/[^0-9]*//g' <<< $input)
|
1
2
3
4
5
6
7
8
|
# To find base directory
APP_ROOT=`dirname "$0"`
# To find the file name
filename=`basename "$filepath"`
# To find the file name without extension
filename=`basename "$filepath" .html`
|