Shell

Shell是什么?

Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

我使用的window系统,安装git版本控制,使用bash控制台进行shell编程,我认为效果不错和大家分享一下!

简介

Shell脚本是以.sh结尾,例如test.sh。

运行shell脚本的方式是 绝对路径下 . test.sh ./test.sh

dome

先编写一个hello world程序。

  1. 创建一个test.sh文件
  2. vim 编制内容
  3. echo “ hello world” #echo 是输出
  4. :wq保存退出
  5. 运行脚本
  6. 输出hello world

语法介绍

基础语法

  • ​$#​​ 是 Shell 中传入参数的个数
  • -k 2 结果的 ​​awk​​ 结果的第二列
  • ​seq​​ 就是这么一个小工具,它可以产生一系列数
  • ​cat index.html​​: 输出 index.html 文件里的内容
  • ​sed -e "s/[^a-zA-Z]/\n/g"​​: 把非字母字符替换成空格,只保留字母字符
  • ​grep -v ^$​​: 去掉空行
  • ​sort​​: 排序
  • ​uniq -c​​:统计相同行的个数,即每个单词的个数
  • ​sort -n -k 1 -r​​​:按照第一列 ​​-k 1​​​ 的数字 ​​-n​​​ 逆序 ​​-r​​ 排序
  • ​head -10​​:取出前十行
  • ​sed​​ 命令可以直接处理文件
  • ​$?​​ 是一个特殊变量,存放有上一次进程的结束状态
  • if [ ] ;then ; else
  • ​[[:space:]]​​​ 是 ​​grep​​ 用于匹配空格或 TAB 键字符的标记
  • %s %c %d %f都是格式替代符
  • %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内
  • 如果不足则自动以空格填充,超过也会将内容全部显示出来。
  • unzip解压
  • %-4.2f 指格式化为小数,其中.2指保留2位小数。
    ###随机数

环境变量 ​​RANDOM​​ 产生从 0 到 32767 的随机数

awk 的 ​​rand()​​ 函数可以产生 0 到 1 之间的随机数

$ echo $RANDOM
81

$ echo "" | awk '{srand(); printf("%f", rand());}'
0.237788

随机产生一个从 0 到 255 之间的数字

$ expr $RANDOM / 128

$ echo "" | awk '{srand(); printf("%d\n", rand()*255);}'

数值类型

对某个数加 1

$ i=0;
$ ((i++))
$ echo $i #"$"是变量的意思
1


$ let i++
$ echo $i
2

$ expr $i + 1 #中间需要有空格
3
$ echo $i
2

$ echo $i 1 | awk '{printf $1+$2}'
3

求模

$ expr 5 % 2
1

$ let i=5%2
$ echo $i
1

$ echo 5 % 2 | bc
1

$ ((i=5%2))
$ echo $i
1

求幂

$ let i=5**2
$ echo $i
25

$ ((i=5**2))
$ echo $i

25
$ echo "5^2" | bc
25

浮点运算

保留 3 位有效数字

$ echo "scale=3; 1/13"  | bc
.076

$ echo "1 13" | awk '{printf("%0.3fn",$1/$2)}'
0.077

布尔运算

true 返回了 0,而 false 则返回了 1

运算符

说明

举例

-eq

检测两个数是否相等,相等返回 true。

[ $a -eq $b ] 返回 false。

-ne

检测两个数是否相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

检测左边的数是否大于右边的,如果是,则返回 true。

[ $a -gt $b ] 返回 false。

-lt

检测左边的数是否小于右边的,如果是,则返回 true。

[ $a -lt $b ] 返回 true。

-ge

检测左边的数是否大于等于右边的,如果是,则返回 true。

[ $a -ge $b ] 返回 false。

-le

检测左边的数是否小于等于右边的,如果是,则返回 true。

[ $a -le $b ] 返回 true。

运算符

说明

举例

!

非运算,表达式为 true 则返回 false,否则返回 true。

[ ! false ] 返回 true。

-o

或运算,有一个表达式为 true 则返回 true。

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

与运算,两个表达式都为 true 才返回 true。

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

运算符

说明

举例

&&

逻辑的 AND

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

||

逻辑的 OR

[[ $a -lt 100

操作符

说明

举例

-b file

检测文件是否是块设备文件,如果是,则返回 true。

[ -b $file ] 返回 false。

-c file

检测文件是否是字符设备文件,如果是,则返回 true。

[ -c $file ] 返回 false。

-d file

检测文件是否是目录,如果是,则返回 true。

[ -d $file ] 返回 false。

-f file

检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

[ -f $file ] 返回 true。

-g file

检测文件是否设置了 SGID 位,如果是,则返回 true。

[ -g $file ] 返回 false。

-k file

检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

[ -k $file ] 返回 false。

-p file

检测文件是否是有名管道,如果是,则返回 true。

[ -p $file ] 返回 false。

-u file

检测文件是否设置了 SUID 位,如果是,则返回 true。

[ -u $file ] 返回 false。

-r file

检测文件是否可读,如果是,则返回 true。

[ -r $file ] 返回 true。

-w file

检测文件是否可写,如果是,则返回 true。

[ -w $file ] 返回 true。

-x file

检测文件是否可执行,如果是,则返回 true。

[ -x $file ] 返回 true。

-s file

检测文件是否为空(文件大小是否大于0),不为空返回 true。

[ -s $file ] 返回 true。

-e file

检测文件(包括目录)是否存在,如果是,则返回 true。

[ -e $file ] 返回 true。

字符串运算

函数

参数处理

说明

$#

传递到脚本的参数个数

$*

以一个单字符串显示所有向脚本传递的参数

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。

$-

显示Shell使用的当前选项,与set命令功能相同。

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

输入输出

命令

说明

command > file

将输出重定向到 file。

command < file

将输入重定向到 file。

command >> file

将输出以追加的方式重定向到 file。

n > file

将文件描述符为 n 的文件重定向到 file。

n >> file

将文件描述符为 n 的文件以追加的方式重定向到 file。

n >& m

将输出文件 m 和 n 合并。

n <& m

将输入文件 m 和 n 合并。

<< tag

将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。