| 网站首页 | 平板电脑 | 台式电脑 | 笔记本电脑 | 电脑故障 | 电脑系统 | 电脑软件 | 电脑游戏 | 电脑主题 | 电脑编程 | 电脑术语 | 电脑知识 | 智能手机 | 
最新公告:     电脑指南网指引你如何选购平板电脑,笔记本电脑,电脑出现故障怎么办,教你怎么重装系统,电脑要怎么安装应用软件和更换主题等,电脑知识尽在电脑指南网!!  [admin  2014-11-10]            各位电脑学者!最新最全的电脑知识尽在--电脑教程网!! 学习电脑时有不懂的,您可以收藏本网站天天浏览电脑教程网学习!!  [电脑教程  2013-12-01]        
电脑网 电脑网
电脑网 您现在的位置: 电脑指南网 >> 电脑编程 >> 脚本编程 >> 正文
电脑网 电脑编程专题 电脑网
电脑网 更多内容 电脑网
电脑网 脚本编程最新更新 电脑网
推荐文章 JS(javascript)倒计时源码
推荐文章 浏览器怎么用Javascript调用exe程热点文章
普通文章 javascript代码在哪个位置热点文章
推荐文章 javascript的运行环境
推荐文章 javascript代码怎么编写
普通文章 怎么用Bookmarklet执行当前网页j热点文章
普通文章 网页中怎么插入JavaScript代码热点文章
推荐文章 bash脚本中if语句怎么用热点文章
推荐文章 Bash脚本编程
普通文章 PHP怎么链接mssql数据库热点文章
电脑网 更多内容 电脑网
电脑网 栏目导航 电脑网
编程语言
java语言 | C语言 | JavaScript语言
PHP语言
网页编程
脚本编程
数据库
电脑网 更多内容 电脑网
电脑网 电脑软件 电脑网
普通文章 百度云os设置在状态栏显示网速的
普通文章 百度云加速怎么刷新网站缓存
普通文章 用百度云下载BT文件怎么下载
普通文章 百度云观测如何使用
普通文章 百度云管家下载文件失败
普通文章 百度云系统如何裁剪歌曲做铃声
推荐文章 百度云如何给分享文件设置密码
推荐文章 百度浏览器怎么添加百度云收藏
电脑网 更多内容 电脑网
电脑网 电脑游戏 电脑网
普通文章 剑灵激活码怎么弄
普通文章 剑灵伙伴是怎样搭配命格的
普通文章 剑灵形象保存及捏脸数据怎么导入
普通文章 指令大全 剑灵怎么跳舞
普通文章 剑灵的客户端(剑灵最新的安装包
普通文章 如何具体兑换剑士秘典二篇秘籍修
普通文章 剑灵怎么升到45级洪门一星
普通文章 洪门秘籍 剑灵如何补刀
电脑网 更多内容 电脑网
电脑网 电脑故障 电脑网
普通文章 u大师制作u盘启动盘操作失败提示
普通文章 鼠标被禁用了怎么办
普通文章 笔记本电脑不能正常关机怎么回事
推荐文章 插两根内存开不了机无法进入系统热点文章
推荐文章 内存条金手指烧毁了怎么修复热点文章
推荐文章 “0x7c84c3e3”指令引用的“0x6e热点文章
推荐文章 电脑每次开机都要重新插拔内存条热点文章
推荐文章 开机提示memory size decreased错热点文章
电脑网 更多内容 电脑网
电脑网 Bash脚本编程

Bash脚本编程

作者:pc.zx98.com 来源:互联网 标签:脚本编程 点击数:        ★★★★
 

bash脚本编程

脚本安全

我的所有bash脚本都以下面几句为开场白:


    #!/bin/bash
    set -o nounset
    set -o errexit

这样做会避免两种常见的问题:

引用未定义的变量(缺省值为“”)

执行失败的命令被忽略

需要注意的是,有些linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”。

还要注意的是,在“errexit”模式下,虽然能有效的捕捉错误,但并不能捕捉全部失败的命令,在某些情况下,一些失败的命令是无法检测到的。(更多细节请参考这个帖子。)

脚本函数

在bash里你可以定义函数,它们就跟其它命令一样,可以随意的使用;它们能让你的脚本更具可读性:


    extractbashcomments() {
        egrep "^#"
    }

    cat myscript.sh | extractbashcomments | wc

    comments=$(extractbashcomments < myscript.sh)

还有一些例子:


    sumlines() {  # iterating over stdin - similar to awk
        local sum=0
        local line=””
        while read line ; do
            sum=$((${sum} + ${line}))
        done
        echo ${sum}
    }

    sumlines < data_one_number_per_line.txt

    log() {  # classic logger
       local prefix="[$(date +%y/%m/%d\ %h:%m:%s)]: "
       echo "${prefix} $@" >&2
    }

    log "info" "a message"

尽可能的把你的bash代码移入到函数里,仅把全局变量、常量和对“main”调用的语句放在最外层。

变量注解

bash里可以对变量进行有限的注解。最重要的两个注解是:

local(函数内部变量)

readonly(只读变量)


    # a useful idiom: default_val can be overwritten
    #       with an environment variable of the same name
    readonly default_val=${default_val:-7}

    myfunc() {
       # initialize a local variable with the global default
       local some_var=${default_val}
       ...
    }

这样,你可以将一个以前不是只读变量的变量声明成只读变量:


x=5
x=6
readonly x
x=7   # failure

尽量对你bash脚本里的所有变量使用local或readonly进行注解。

用$()代替反单引号(`)

反单引号很难看,在有些字体里跟正单引号很相似。$()能够内嵌使用,而且避免了转义符的麻烦。


# both commands below print out: a-b-c-d
echo "a-`echo b-\`echo c-\\\`echo d\\\`\``"
echo "a-$(echo b-$(echo c-$(echo d)))"

用[[]](双层中括号)替代[]

使用[[]]能避免像异常的文件扩展名之类的问题,而且能带来很多语法上的改进,而且还增加了很多新功能:

操作符 功能说明
|| 逻辑or(仅双中括号里使用)
&& 逻辑and(仅双中括号里使用)
< 字符串比较(双中括号里不需要转移)
-lt 数字比较
= 字符串相等
== 以globbing方式进行字符串比较(仅双中括号里使用,参考下文)
=~ 用正则表达式进行字符串比较(仅双中括号里使用,参考下文)
-n 非空字符串
-z 空字符串
-eq 数字相等
-ne 数字不等

单中括号:


[ "${name}" \> "a" -o ${name} \< "m" ]

双中括号


[[ "${name}" > "a" && "${name}" < "m"  ]]

正则表达式/globbing

使用双中括号带来的好处用下面几个例子最能表现:


t="abc123"
[[ "$t" == abc* ]]         # true (globbing比较)
[[ "$t" == "abc*" ]]       # false (字面比较)
[[ "$t" =~ [abc]+[123]+ ]] # true (正则表达式比较)
[[ "$t" =~ "abc*" ]]       # false (字面比较)

注意,从bash 3.2版开始,正则表达式和globbing表达式都不能用引号包裹。如果你的表达式里有空格,你可以把它存储到一个变量里:


r="a b+"
[[ "a bbb" =~ $r ]]        # true

按globbing方式的字符串比较也可以用到case语句中:


case $t in
abc*)  <action> ;;
esac

字符串操作

bash里有各种各样操作字符串的方式,很多都是不可取的。

基本用户


    f="path1/path2/file.ext"

    len="${#f}" # = 20 (字符串长度)

    # 切片操作: ${<var>:<start>} or ${<var>:<start>:<length>}
    slice1="${f:6}" # = "path2/file.ext"
    slice2="${f:6:5}" # = "path2"
    slice3="${f: -8}" # = "file.ext"(注意:"-"前有空格)
    pos=6
    len=5
    slice4="${f:${pos}:${len}}" # = "path2"

替换操作(使用globbing)


    f="path1/path2/file.ext"

    single_subst="${f/path?/x}"   # = "x/path2/file.ext"
    global_subst="${f//path?/x}"  # = "x/x/file.ext"

    # 字符串拆分
    readonly dir_sep="/"
    array=(${f//${dir_sep}/ })
    second_dir="${arrray[1]}"     # = path2

删除头部或尾部(使用globbing)


    f="path1/path2/file.ext"

    # 删除字符串头部
    extension="${f#*.}"  # = "ext"

    # 以贪婪匹配方式删除字符串头部
    filename="${f##*/}"  # = "file.ext"

    # 删除字符串尾部
    dirname="${f%/*}"    # = "path1/path2"

    # 以贪婪匹配方式删除字符串尾部
    root="${f%%/*}"      # = "path1"

避免使用临时文件

有些命令需要以文件名为参数,这样一来就不能使用管道。PC.Zx98.com这个时候 <() 就显出用处了,它可以接受一个命令,并把它转换成可以当成文件名之类的什么东西:


# 下载并比较两个网页
diff <(wget -o - url1) <(wget -o - url2)

还有一个非常有用处的是”here documents”,它能让你在标准输入上输入多行字符串。下面的’marker’可以替换成任何字词。


# 任何字词都可以当作分界符
command  << marker
...
${var}
$(cmd)
...
marker

如果文本里没有内嵌变量替换操作,你可以把第一个marker用单引号包起来:


command << "marker"
...
no substitution is happening here.
$ (dollar sign) is passed through verbatim.
...
marker

内置变量

变量 说明
$0 脚本名称
$n 传给脚本/函数的第n个参数
$$ 脚本的pid
$! 上一个被执行的命令的pid(后台运行的进程)
$? 上一个命令的退出状态(管道命令使用${pipestatus})
$# 传递给脚本/函数的参数个数
$@ 传递给脚本/函数的所有参数(识别每个参数)
$* 传递给脚本/函数的所有参数(把所有参数当成一个字符串)

提示

使用$*很少是正确的选择。

$@能够处理空格参数,而且参数间的空格也能正确的处理。

使用$@时应该用双引号括起来,像”$@”这样。

调试

对脚本进行语法检查:


bash -n myscript.sh

跟踪脚本里每个命令的执行:


bash -v myscripts.sh

跟踪脚本里每个命令的执行并附加扩充信息:


bash -x myscript.sh

你可以在脚本头部使用set -o verbose和set -o xtrace来永久指定-v和-o。当在远程机器上执行脚本时,这样做非常有用,用它来输出远程信息。

什么时候不应该使用bash脚本

你的脚本太长,多达几百行

你需要比数组更复杂的数据结构

出现了复杂的转义问题

有太多的字符串操作

不太需要调用其它程序和跟其它程序管道交互

担心性能

这个时候,你应该考虑一种脚本语言,比如python或ruby。


 

更多关注:脚本编程

脚本编程栏目电脑编程频道返回首页
  • 上一篇文章:

  • 下一篇文章:
  • 电脑网 脚本编程相关文章 更多内容 电脑网
    [脚本编程]怎么用Bookmarklet执行当前网页javascr
    [脚本编程]网页中怎么插入JavaScript代码
    [脚本编程]bash脚本中if语句怎么用
    [脚本编程]PHP怎么链接mssql数据库
    [脚本编程]python函数如何使用
    [脚本编程]python清空list列表的方法
    [脚本编程]Linux系统编怎么写shell脚本
    [脚本编程]PHP的pear扩展如何安装
    [脚本编程]什么是脚本编程
    电脑网 电脑网 电脑网

    JS(javascript)倒计时

    浏览器怎么用Javascri

    javascript代码在哪个

    怎么用Bookmarklet执行
    图片 脚本编程最新推荐 更多>> 图片
     [脚本编程]JS(javascript)倒计时源码
     [脚本编程]浏览器怎么用Javascript调用ex
     [脚本编程]javascript的运行环境
     [脚本编程]javascript代码怎么编写
     [脚本编程]bash脚本中if语句怎么用
     [脚本编程]Bash脚本编程
     [脚本编程]python函数如何使用
     [脚本编程]Linux系统编怎么写shell脚本
     [脚本编程]什么是脚本编程
    图片 图片
    图片 电脑编程推荐 更多>> 图片
    推荐文章 [数据库]SQL数据库怎么导入导出数据热点文章
    推荐文章 [C语言]怎么用C语言编写一个程序向爱的人热点文章
    推荐文章 [编程语言]编程语言有哪些热点文章
    推荐文章 [数据库]开启SQL数据库服务的方法热点文章
    推荐文章 [网页编程]php语言的特点热点文章
    推荐文章 [编程语言]现在学哪种编程语言比较有前途热点文章
    推荐文章 [数据库]visio画数据库模型图怎么用热点文章
    推荐文章 [编程语言]哪种编程语言最好学热点文章
    推荐文章 [java语言]Java Web项目更改项目名后报错怎热点文章
    推荐文章 [脚本编程]Linux系统编怎么写shell脚本热点文章
    图片 图片

    裴紫绮美女模特电脑主

    气质美女免费电脑主题

    杉原杏璃电脑桌面壁纸

    美女桌面清新白裙壁纸
     网友评论: 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口

    | 本站简介 | 加入收藏 | 联系站长 | 本站友链 | 申请友链 | 版权申明 | 返回首页 |

    声明:文章部分来源网络,转载请标明出处!
    网站备案号:粤ICP备12041130号
    您身边的最好的电脑指南网!
    网站站长:QQ:1141452800