跳转至

Shell脚本

1. Shell 简述简介

Bash,它是目前大多数GUN/Linux系统默认的shell环境,所以大部分案例和讨论都是假定在此基础之上进行的。

用户分类

  • **$**表示的是普通用户
  • **#**表示管理员用户root

#!

  • shell脚本通常是以 #!/bin/bash
  • /bin/bash表示Bash解释器命令的位置,当然也可以使用其他解释器
  • Linux内核会自动读取首行并注意到#!/bin/bash,运行/bin/bash来执行脚本

运行方式

将脚本作为bash的命令行参数 bash script.sh

相对路径 chmod +x script.sh ./script.sh

chmod +x script.sh /home/path/script.sh

变量和环境变量

**`变量`是任何一种编程语言都必不可少的组成部分,用于存放各类数据。**

   在 Bash 中,每一个变量的值都是字符串
   无论你给变量赋值时有没有使用引号,值都会是字符串的形式存储的
   `环境变量`就是用来被 shell 环境和操作系统环境用来存储一些特殊值的变量



**查看环境变量**

   所有与终端相关
   `env`命令

   `cat /proc/$PID/environ`
   默认彼此之前由`\0`分割,可以使用`tr`命令进行转换

**使用变量**

   定义变量
   `var=value`

   `echo $var`
   `echo ${var}`

**添加 PATH 变量路径**

   `PATH`变量通常定义在`/etc/envitonment`或`/etc/profile`或`~/.bashrc`中
   `export PATH="$PATH:/home/escape/bin"`

**变量的用途**

   获得字符串长度
   `length=$(#var)`

   `echo $SHELL`
   `echo $0`

   `[ $UID -ne 0 ]`

   `echo $PS1`
   `PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$'`
   可以使用类似`\e[1;31`的特定转义字符来设置彩色提示字符串

**使用函数添加环境变量**

   把下面的函数加入`~/.bashrc`中即可
   `prepend() { [ -d "$2" ] & &  eval $1=\"$2':'\$$1\" & &  export $1; }`
   判断第二个参数指定的目录是否存在
   将第一个参数所指向的变量值设置成为第二个参数的值加上`:$1`的形式
   设置为环境变量

   `prepend PATH /opt/myapp/bin`

   `prepend() { [ -d $2 ] & &  eval $1=\"$2\$\{$1+':'\$$1\}\" & &  export $1; }`
   其中`$1`不为空的时候使用表达式`':'\$$1`
   `$$1`表示第一个参数的实际值

进行数学运算

Bash shell环境中,可以使用let(())[]执行基本的算术操作,使用exprbc可以进行高级操作

基本算数

let

  • let result=num1+num2
  • let num++
  • let num--
  • let num+=5
  • let num-=5

$(())

  • result=$((num1+num2))
  • result=$(($num+5))

$[]

  • result=$[ num1+num2 ]
  • result=$[ $num+5 ]

高级算数

expr expr 3+4 bc result=$(expr $num+5)

  • 普通用法 echo "4 * 0.56" | bc
  • 设定小数精度 echo "scale=2; 3/8" | bc
  • 十进制转二进制 echo "obase=2; $num" | bc
  • 二进制转十进制 echo "obase=10; ibase=2; $num" | bc
  • 平方根 echo "sqrt(100)" | bc
  • 计算平方 echo "10^10" | bc

逻辑判断

逻辑表达式 表达式解释说明
! 逻辑非
-a 逻辑且
-o 逻辑或

语句判断

判断语句 语句解释说明
[-e file] 如果 file 文件存在则为真
[-d file] 如果 file 存在且是一个目录则为真
[-f file] 如果 file 存在且是一个普通文件则为真
[-b file] 如果 file 存在且是一个块特殊文件则为真
[-s file] 如果 file 存在且大小不为 0 则为真
[-c file] 如果 file 存在且是一个字特殊文件则为真
[-h file] 如果 file 存在且是一个符号连接则为真
[-p file] 如果 file 存在且是一个名字管道则为真
[-r file] 如果 file 存在且是可读的则为真
[-w file] 如果 file 存在且是可写的则为真
[-x file] 如果 file 存在且是可执行的则为真
[-L file] 如果 file 存在且是一个符号连接则为真
[-S file] 如果 file 存在且是一个套接字则为真
[-O file] 如果 file 存在且属有效用户 ID 则为真
[-G file] 如果 file 存在且属有效用户组则为真
[-t FD] 如果文件描述符 FD 打开且指向一个终端则为真
[-u file] 如果 file 存在且设置了 SUID(用 chmod u+s 设置)则为真
[-g file] 如果 file 存在且已经设置了 SGID(用 chmod g+s 设置)则为真
[-k file] 如果 file 存在且已经设置粘制位(用 chmod a+t 设置)则为真

条件表达式

条件表达式 表达式解释说明
[string] string 的长度为非零 non-zero 则为真
[-n string] string 的长度为非零 non-zero 则为真
[-z string] string 的长度为零则为真
[sting1==string2] 如果 2 个字符串相同则为真
[string1!=string2] 如果 2 个字符串不相等则为真
[string1 –eq string2] 等于为真
[string1 -ne string2] 不等于为真
[string1 -le string2] 小于为真
[string1 –gt string2] 大于为真
[string1 –ge string2] 大于等于为真
[file1 –nt file2] 如果 file1 比 file2 要新或者 file1 存在且 file2 不存在则为真
[file1 –ot file2] 如果 file1 比 file2 要老或 file2 存在且 file1 不存在则为真
[file1 –ef file2] 如果 file1 和 file2 指向相同的设备和节点号则为真