shell(一)

shell解析器

执行命令

[root@192 /]# sudo cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

可以看到shell有4种解析器,默认解析器 /bin/bash

shell入门

脚本格式

脚本以 #!/bin/bash 开头,指定解析器

#!/bin/bash
echo "hello world"

执行 shell 脚本

  • bash xxx.sh 或者 sh xxx.sh ,调用bash 解析器执行,脚本本身不需要执行权限

  • ./xxx.sh 脚本自己执行,注意有没有执行权限

shell中的变量

系统变量

常用系统变量

$HOME, $PWD, $SHELL, $USER,获取所有系统变量 set

自定义变量

1. 基本语法

  • 定义变量: 变量=值,不能有空格

  • 删除变量: unset 变量,不能删除只读变量

  • 只读变量: readonly 变量,只能读取,不能修改、删除

2. 定义变量规则

  • 变量名称可以由字母、数字、下划线组成,但是不能以数字开头,环境变量建议大写

  • 等号两侧不能有空格

  • 在 bash 中,变量默认类型都是 字符串类型,无法直接进行数值运算

  • 变量的值如果有空格,需要使用 双引号单引号 括起来

  • 将 局部变量 升为 全局环境变量,可供其他shell程序使用:export 变量名

3.使用变量

$param 或 ${param}, 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

特殊变量

$n :n为数字,$0代表该脚本名称,$1- $9 代表第一至第九个参数,十以上的参数需要用大括号包含,如 ${10}

$# :获取所有输入参数的个数,常用于循环

$* :表示命令行中的所有参数, $* 把所有参数看成一个整体

$@ :表示命令行中的所有参数,不过 $@ 把每个参数区分对待

$? :最后一次执行命令的返回状态,正确执行为0,执行错误则为非0(具体是哪个数,由命令自己决定), 函数返回值在调用该函数后通过 $? 来获得

$* 与 $@ 区别:

  • 相同点:都是引用所有参数

  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数 )

字符串

  • 获取字符串长度, ${#string}

  • 获取子字符串, ${string:n1:n2}

数组

定义

array=(v1 v2 v3 ...),注意每个值中间用空格隔开

根据索引 修改/赋值

array[i]=v_i

使用数组变量

  • ${array[i]},获取某个索引值

  • ${array[@]},${array[*]} ,获取数组中的所有值

  • ${#array[@]},${#array[*]} ,获取数组长度,与字符串相同

运算符

基本语法

有两种写法:

  • "$((运算式))""$[运算式]",运算式就是原始的易读运算式

  • expr + , - , \* , / , % ,加,减,乘(注意有个反斜杠 \) ,除,取余;expr 运算符之间要有空格

计算 (3+2)*4 : 先计算3+2,再做*4,用Esc下面的键 ` 隔开

expr `expr 3 + 2` \* 4
echo $[(3+2)*4]

条件判断

1. 基本语法

[ condition ] 注意 condition 前后要有空格

条件非空即为true,[] 则为false

多条件判断:与 && , 或 ||

2. 常用判断条件

(1)字符串比较

  • =,相等;[ $a = $b ],等号两边有空格

  • !=,不等;[ $a != $b ],等号两边有空格

  • -z ,字符串长度是否为0,为0返回true, [ -z $a ]

  • -n,字符串长度是否不为0,不为0返回true,[ -n $a ]

  • $, 字符串是否为空,不为空返回 true ,[ $a ]

(2)两个整数之间比较

  • -eq 等于 (equal)

  • -ne 不等于 (not equal)

  • -lt 小于 (less than)

  • -le 小于等于 (less equal)

  • -gt 大于 (greater than)

  • -ge 大于等于 (greater equal)

(3)按照问价权限进行判断

  • -r 读权限, [ -r $file ]

  • -w 写权限, [ -w $file ]

  • -x 执行权限, [ -x $file ]

(4)按照文件类型进行判断

  • -f 文件存在且为常规文件,[ -f $file ]

  • -d 文件存在且为目录,[ -d $file ]

  • -e 文件存在 (existence), [ -e $file ]

 

shell(一)

上一篇:设置linux ssh 连接超时时间


下一篇:shell(二)流程控制和函数