阅读更多

3顶
1踩

编程语言

原创新闻 我从其他Shell脚本中学到了什么?

2013-08-16 11:16 by 副主编 WnouM 评论(1) 有10307人浏览
作者Fizer Khan是一位Shell脚本迷,他对有关Shell脚本新奇有趣的东西是如此的痴迷。最近他遇到了authy-ssh脚本,为了缓解ssh服务器双重认证问题,他学到了许多有用且很酷的东西。对此,他想分享给大家。

1.  为输出着色

大多数情况下,你希望输出带颜色的结果,比如绿色代表成功,红色代表失败,黄色代表警告。

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."


这里使用tput来设置颜色、文本设置并重置到正常颜色。想更多了解tput,请参阅prompt-color-using-tput

2.  输出调试信息

输出调试信息只需调试设置flag。

function debug() {
    if [[ $DEBUG ]]
    then
        echo ">>> $*"
    fi
}
 
# For any debug message
debug "Trying to find config file"


某些极客还会提供在线调试功能:

# From cool geeks at hacker news
function debug() { ((DEBUG)) && echo ">>> $*"; }
function debug() { [ "$DEBUG" ] && echo ">>> $*"; }


3.  检查特定可执行的文件是否存在

OK=0
FAIL=1
 
function require_curl() {
    which curl &>/dev/null
    if [ $? -eq 0 ]
    then
      return $OK
    fi
 
    return $FAIL
}


这里使用which来命令查找可执行的curl 路径。如果成功,那么可执行的文件存在,反之则不存在。将&>/dev/null设置在输出流中,错误流会显示to /dev/null (这就意味着在控制板上没有任何东西可打印)。

有些极客会建议直接通过返回which来返回代码。

# From cool geeks at hacker news
function require_curl() { which "curl" &>/dev/null; }
function require_curl() { which -s "curl"; }


4.  输出脚本Usage

当我开始编写shell 脚本,我会用echo来命令打印已使用的脚本。当有大量的文本在使用时, echo命令会变得凌乱,那么可以利用cat来设置命令。

cat << EOF
Usage: myscript <command> <arguments>
VERSION: 1.0
Available Commands
    install - Install package
    uninstall - Uninstall package
    update - Update package
    list - List packages
EOF


这里的<<被称为<<here document,字符串在两个EOF中。

5.  用户配置值vs. 默认值

有时,如果用户没有设置值,那么会使用默认值。

URL=${URL:-http://localhost:8080}


检查URL环境变量。如果不存在,可指定为localhost。

6.  检查字符串长度

if [ ${#authy_api_key} != 32 ]
then
  red "you have entered a wrong API key"
  return $FAIL
fi


利用 ${#VARIABLE_NAME} 定义变量值的长度。

7.  读取超时输入

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)


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`


英文出自:FizerKhan
来自: CSDN
3
1
评论 共 1 条 请登录后发表评论
1 楼 joe9i0 2013-08-20 10:08
6, 7 不常用, 其他常常用.

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • struts1.2之LookupDispatchAction

    LookupDispatchAction源代码:   public  ActionForward  execute(){   ...    String  parameter  =  mapping.getParameter();    String  methodName  =  getMethodName(mapping,  form,  req

  • Struts1.2中的LookupDispatchAction配置

    版本:eclipse 3.3,myeclipse 6.0,tomcat 6.0在myeclipse中新建项目StrutsDemo,导入Struts1.2属性在com.shiryu.action包中新建TestAction.javapackage com.shiryu.action;import java.util.HashMap;import java....

  • Struts 1.2&&Struts 2

    Struts 1.2 第一天: MVC : M : 业务逻辑,业务数据 ( 可以重复利用 ) java Bean ( VO BO) EJB 其实struts1没有实现业务层,也无法实现 V : 显示逻辑 ,同一份数据 ,对应多种显示方法. JSP代码实现。 C:流程控制...

  • struts1.2教程

    1.1 Struts内部机制MVC模式MVC(Model模型,View视图,Controller控制器)...负责控制流程,由ActionServlet负责读取struts-config.xml,并使用ActionMapping来查找对应的Action1.2 添加Struts开发环境1.2.1 使用MyEc

  • 对struts1.2中ActionForm的理解

    转载:... 初学struts的人我认为首先应该把struts1.2学精,何为精,就是明白struts的控制流程以及它核心API的实现原理(比如 Action/DispatchAction/MappingDispatchAction/LookupDispatchA

  • struts1.2 几种Action详解

    LookupDispatchAction,EventDispatchAction和MappingDispatchAction使用中的区别 java.lang.Object  org.apache.struts.action.Action  org.apache.struts.actions.DispatchAction  org.a

  • struts1.2学习笔记本

    http://www.itpob.cnStruts1.2 学习笔记收藏 1 Struts1.21.1 Struts内部机制MVC模式MVC(Model模型,View视图,Controller控制器)模型:用于表示业务数据,调用业务逻辑,由系统状态Bean ActionForm和商业逻辑的...

  • 对struts1.2中ActionForm的一点理解

    初学struts的人我认为首先应该把struts1.2学精,何为精,就是明白struts的控制流程以及它核心API的实现原理(比如Action/DispatchAction/MappingDispatchAction/LookupDispatchAction/ActionForm的实现原理)然后...

  • struts1.2 form

    何为精,就是明白struts的控制流程以及它核心API的实现原理(比如Action/DispatchAction/MappingDispatchAction/LookupDispatchAction/ActionForm的实现原理)然后自己会写一个“山寨版”的struts1.2,只有到达这样...

  • struts1.2_struts-config配置

    1.引用头: "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"&gt;2.全局跳转与异常 2.1: 

  • struts1.2中ActionForm的理解

    何为精,就是明白struts的控制流程以及它核心API的实现原理(比如Action/DispatchAction/MappingDispatchAction/LookupDispatchAction/ActionForm的实现原理)然后自己会写一个“山寨版”的struts1.2,只有到达这样...

  • 温习一下Struts1.2x

    一、struts概述 1、Struts实现MVC设计模式 (1)Struts实质上就是在JSPModel2的基础山实现一个MVC框架。 1)模型:由业务实现业务逻辑的JavaBean或EJB组件构成 2)控制器:由ActionServlet和Action来实现 ...

  • Struts1.2 学习笔记

    1 Struts1.21.1 Struts内部机制MVC模式MVC(Model模型,View视图,Controller控制器)模型:用于表示业务数据,调用业务逻辑,由系统状态Bean ActionForm和商业逻辑的JavaBean来构建视图:由JSP和Struts提供的自定义...

  • struts1.2验证框架续

    struts 验证 代码级验证:ActionForm, ActionErrors validate(), 1, new ActionErrors 2, 进行验证 3, errors.add(&quot;xx&quot;,new ActionMessage(xxx)) 4, saveErrors(request, errors); saveMessages...

  • 鄙人一点对struts1.2中ActionForm的理解

    转自:...初学struts的人我认为首先应该把struts1.2学精,何为精,就是明白struts的控制流程以及它核心API的实现原理(比如Action/DispatchAction/MappingDispatchAction/LookupDispatc

  • Struts_LookupDispatchAction简单的例子

    如果大家用过DispatchAction的话,接触MappingDispatchAction的话就不是很难了,大家记住了这是struts1.2里新加入的。首先说一下它的的优点: (1)可以为每个响应用户请求的Action方法定义自己的name,validate,...

  • what changs in struts 1.2

    This section highlights some of the changes of Struts that have taken place since the last release(version 1.2). Subscribers to the struts-dev mailing list, receive reports of all cha

  • 使用MinGW集成编译QT和Berkeley DB

    http://blog.hexun.com/jslx/viewarticle.aspx?articleid=970933由于QT 4.0.0 OpenSource Windows GPL只支持MinGW编译器,而Berkeley DB 4.3.28 for Windows 官方发行包支持的是Visual Studio。Visual Studio生成的是.lib,.dll库文件,而MinGW只支持.

  • 悲哀哉,没出息哉,中国程序员?

    程序员,这个名字,现在听起来,已经有些悲哀。我无法不为自己的今天恸哭。我不知道四年之中我经历了多少次选择,经历了多少变化。今天我坐在这里写这样的文章,我不知道四年前的我能否理解。为何不是四年前我就能明白这样的道理,中国公司里的程序员其实是一个低级的脑力劳动者?没有梦想,没有血肉,没有精神,没有组织,没有地位,没有福利,没有前途,没有关怀,没有期望,没有晋升!一直以来我以为我可以靠程序员这样的工作成

  • 关于泛型编程思想的言论摘录(不断更新)

     1在C++中还没有引进模板的时候,C++STL之父stepanov就敏锐的发觉,面向对象理论并不能描述现有的所有结构,比如,算法就不是一个对象,再深入下去,他发觉有很多算法的抽象逻辑并不依赖于它所作用的对象...泛型可以在几乎无损于效率的情况下支持代码的高度可复用性,并且具有数学的抽象美(这一点接触过STL源码的人都非常清楚)。于是,泛型几乎立即就成了C++中举足轻重的特性之一。 2004-9-

Global site tag (gtag.js) - Google Analytics