shell脚本

与内核通信的命令行环境,命令解释器

常见shell种类

  • Bourne Shell(/usr/bin/sh或/bin/sh)

  • Bourne Again Shell(/bin/bash)

  • C Shell(/usr/bin/csh)

  • K Shell(/usr/bin/ksh)

  • TENEX C Shell(tcsh)

  • Friendly Interactive Shell(fish)

  • Z Shell(zsh)

start

文件开头,用于指出使用的shell


#!/bin/bash

该语句为第一行首行,之后是脚本!

最后使用 .sh 保存,执行时先要 chmod +x ./脚本,然后执行./文件名.sh

语法

变量

命名规则基本与其他语言相似


variable="bianliang" # =两边不能有空格,赋值不加$

echo $variable

echo ${variable}  #可加可不加 `{}` ,推荐加

只读变量: readonly variable

删除变量: unset variable

数据类型

字符串

variable="字符串9527"

使用单引号或者双引号都可以,推荐双引号

获取字符串长度: echo ${#variable}

截取字符串(从第二个截取到第四个): ${variable:1:4}

查找字符串:


`expr index "$variable" 查找的字符串

数组

  • 支持一维数组

  • 0下标开始

  • 支持数组元素运行,但是值应大于0


array=(var1 var2 ... varn)  #定义数组,也可一行一个值

echo ${array[n]}  #输出数组n的值

echo ${array[@]}  #输出所有元素

echo ${#array[*]}  #输出数组个数,加`#`及输出长度

注释


# 单行注释

# 多行注释
:<<EOF

注释内容

EOF

除了EOF,也可使用其他符号,只需首尾相同即可

向脚本传递参数

参数解释
$n第n个参数
$#传递参数个数
$$$脚本运行UID
$!后台运行最后一个进程UID
$*传递的所有参数,必须由"包围.
$@同上,参数换行
$-shell当前选项,与set功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

运算符

算数运算符

原生bash不支持,可使用命令 awkexpr 等(expr为表达式计算工具)


val=`expr 2 + 2`

echo "$val"

*乘号前加上转义(\)

关系运算符

只能判断数字,包括字符串内的数字.返回true or false

运算符解析(成立均返回true)
-eq==
-ne!=
-gt>
-lt<
-ge>=
-le<=

ex: if [$a -eq $b]

布尔与逻辑运算符

运算符解析(成立均返回true)
布尔 
!
-o
-a
逻辑 
&&AND
两个竖线OR

字符串运算符

运算符解析
=字符串是否相等
!=不等
-z长度是否为0
-n长度是否不为0
$字符串是否为空;ex: $a

文件属性测试

运算符解析
-b file是否块设备文件
-c是否字符设备文件
-d是否目录
-f是否普通文件
-g是否设置SGID位
-k是否设置粘着位(Sticky Bit)
-p是否有名管道
-u是否设置SUID位
-r是否可读
-w是否可写
-x是否可执行
-s是否为空(文件大小是否为0)
-e文件/目录是否存在
-S是否socket
-L文件是否是个链接

判断

if 条件
then
  命令
else
  命令
fi

# elseif

if 条件
then
  命令
elif 命令
then
  命令
fi

#case

case 变量 in 
 值1)
  命令
  ;;
 值2)
  命令
  ;;
esac

break continue

循环

# for

for var in ary[]
do
  命令
done

# while

while (( $val<=5 ))
do
  命令
done

# do while

until 判断
do
  命令
done

函数


main(){
  巴拉巴拉
  return 1
}

main

参数传递同上

参考资料

菜鸟教程-shell

阮一峰bash脚本教程