Bonky
Neither believe nor reject anything, because any other person has rejected or believed it. Heaven has given you a mind for judging truth and error, Use it.
By Thomas Jefferson

Linux Shell脚本

执行方式之间的差异

  • sh script./script 是创建一个子 shell,然后在子 shell 里面执行脚本。(所以脚本里面的变量不会在本环境生效,想起了我以前写了脚本快速进入 anaconda 环境,在脚本里面执行 source /路径/activate 结果还是没法进入环境,其实进入的是子 shell)
  • source 在当前 shell 里面执行脚本。

shell 脚本的追踪和 debug

一般来说,首先先用 -n 检查是否有语法问题,然后执行有问题再用 -x 或者 -v 进行 debug

几个简单的脚本

创建一个有输入的脚本

重点是使用 read 指令,如果你想要加上提示文字请使用 -p 选项。下面 echo 的 -e 选项作用是允许转义字符(发现 macOS 的不需要直接支持)。

根据日期不同创建文件名

date 指令的使用

基本也最常用使用方法就是这样:

其中格式串中的特殊字符的含义如下,用的最多的是 %Y (年) , %m(月) , %d(天) ,%H(小时),%M(分钟),%S (秒),其实只要记住大小写也很好记住的:

当然还可以使用 -d 选项指定特定的时间,下面这几种格式都是 OK 的:

条件表达式

if…elif…else…fi

基本格式如下,注意 if 和 elif 后面需要接 then,然后就是最后需要有代表 if 结束的 fi :

case…esac

函数

那有人想问了,这个怎么传参呢。其实和 shell 脚本一样,通过 $1$2 这样的来传参,只不过和脚本不共用而已。

循环

不定循环 while, until

while 是满足条件则进行循环。

until 是满足条件则退出循环。

固定循环 for

for 循环第一次循环 var 等于 con1,第二次循环 var 等于 con2,以此类推。。。

for 循环和 cut 指令配合使用可以处理一个文本后,然后循环其变量:

假如我们想从 1 循环到 100 怎么做呢?首先一个办法是使用 seq 指令:

其次,for 也提供类似高级语言的写法:

数学运算

简单的加减乘除

除了使用 declare 以外我们还可以使用 $((计算式)) 来进行运算(比较推荐这一种):

如果你想要计算含有小数点的数据时,应该 bc 这个指令。

bc 指令

一般在 shell 里面使用一般来说利用 echo 将表达式通过管道传给 bc 即可(-l 选项是可以数学库的函数,一般来说带上没什么影响):

重点是如何写表达式,如果是普通的加减乘除直接像下面这么写即可:

其中 scale=2 代表保留的小数点为2位。然后,bc 有一个最最最好用的东西就是他可以进行进制的转换:

obase 代表输出进制,ibase 代表输入进制。当然,还有一些常用的函数可供你使用:

函数名 作用
s(x) 计算 x 的正弦值,x 是弧度值。
c(x) 计算 x 的余弦值,x 是弧度值。
a(x) 计算 x 的反正切值,返回弧度值。
l(x) 计算 x 的自然对数。
e(x) 求 e 的 x 次方。
j(n, x) 贝塞尔函数,计算从 n 到 x 的阶数。

比如,我们可以计算 pi 的值:

强大的 expr 指令

四则运算(一般不推荐)

需要注意两点:

  • 运算符左右都有空格,如果没有空格表示是字符串连接
  • 使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义

字符串操作

  • expr length 字串,返回字符串长度
  • expr indexString1 String2,返回字符串2在字符串1的第一个位置(从1开始)
  • expr substr 内容 起始位置 终点位置,提取字符串的子串

判断工具

test 指令

有一个操作:

我们可以这么理解,假设上面语句通过逻辑符号分为3个部分,只有 (1) 成功执行才会执行 (2),只有 (1) 和 (2) 都没有成功执行才会执行 (3) 。测试一下可以看到:

[ ] 符号

通过这个我们可以写一个简单的判断脚本:

带参数的脚本

echo $# , echo $@ 结果分别是 2hello hhh

同时,还有个非常好用的指令 shift,非常适合不定长的参数的处理,每次可以向前出队列一个参数。打个比方原来 $@1 2 3 4,经过一次 shift 结果 $@ 变成 2 3 4。我们可以用他来进行不定长参数的求和:

Share

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注