Linux Bash脚本15分钟进阶教程

slice1="$"

# = "path2/file.ext"

slice2="$"

# = "path2"

slice3="$"

# = "file.ext"(注意:"-"前有空格)

pos=6

len=5

slice4="$:$}"

# = "path2"

替换操作(使用globbing)

f="path1/path2/file.ext"

single_subst="$"

# = "x/path2/file.ext"

global_subst="$"

# = "x/x/file.ext"

# 字符串拆分

readonly DIR_SEP="/"

array=($/ })

second_dir="$"

# = path2

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

f="path1/path2/file.ext"

# 删除字符串头部

extension="$" # = "ext"

# 以贪婪匹配方式删除字符串头部

filename="$" # = "file.ext"

# 删除字符串尾部

dirname="$"

# = "path1/path2"

# 以贪婪匹配方式删除字符串尾部

root="$"

# = "path1"

避免使用临时文件

有些命令需要以文件名为参数,这样一来就不能使用管道。这个时候?

# 下载并比较两个网页

diff

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

# 任何字词都可以当作分界符

command

...

$

$(cmd)

...

MARKER

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

command

...

no substitution is happening here.

$ (dollar sign) is passed through verbatim.

...

MARKER

内置变量

变量说明

$0脚本名称

$n传给脚本/函数的第n个参数

$$脚本的PID

$!上一个被执行的命令的PID(后台运行的进程)

$?上一个命令的退出状态(管道命令使用$)

$#传递给脚本/函数的参数个数

$@传递给脚本/函数的所有参数(识别每个参数)

$*传递给脚本/函数的所有参数(把所有参数当成一个字符串)

提示

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

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

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

调试

对脚本进行语法检查:

bash -n myscript.sh

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

bash -v myscripts.sh

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

bash -x myscript.sh

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

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

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

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

出现了复杂的转义问题

有太多的字符串操作

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

担心性能

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

END

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180717A1KQZ000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券