目录
1 运行shell脚本的三种方式
(1)./test.sh
(2)sh test.sh
(3)/bin/sh test.sh
(4)source test.sh 或者 直接一个 . test.sh
正常来说,使用第一种就可以了。
2 变量声明
2.1 局部变量
name=haha 这种形式,中间不要有空格。
多个字符可以使用这样的形式 name="haha good" 或者 name='haha good'
2.2 全局变量
先声明成局部变量,然后使用export关键字进行导出成全局变量
my_var=hello
export my_var
在外层定义的全局变量在内层更改的话不会影响外层。(就是子shell里面做的更改不会影响父shell)。
变量默认都是字符串类型的,要是想要运算的话,声明的时候可以
使用 a=$((1+5)),这种$加上双括号的形式
使用a=$[1+5],这种$加上一层中括号的形式
可以使用 unset my_var 撤销变量,但是不能unset只读变量
2.3 只读变量
readonly b=5
变量间的复制,并不是地址复制,单纯的值复制
2.4 特殊变量
2.4.1 $n
通过 $n的形式,获取执行.sh文件的时候,后面跟的第n个参数。n超过9之后用{}括起来,就像${10}。$0代表当前脚本
2.4.2 $#
$# 用于获取输入参数的个数,常用于循环,判断参数个数是否正确以及加强脚本的健壮性
2.4.3 $*、$@
这两个都是代表命令行的所有参数,只不过$*把所有参数看成一个整体,$@把每一个参数区分对待,就可以使用循环这种操作。
2.4.4 $?
功能描述:最后一次执行的命令(或者说就是紧挨着的上一次命令)的返回状态。如果这个变量值为0,证明上一个命令正确的执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行的不正确了。
3运算符
使用 expr (未简化前)
expr 1 + 2
expr 3 - 2
expr 5 \* 2
3.1 基本语法
$(()) 或 $[] 就是上文提到的
$[5*10]
a=$[6+8]
a=$[4+5]
#也可以使用命令替换
a=$(expr 2 + 4)
a=`expr 2 + 4`
4条件判断
4.1 基本语法
-
test condition condition中的判断符号前后要有空格,否则会将里面的表达式作为一个整体,非空就直接为真了
-
[ condition ] (注意condition前后要有空格,同时判断符号也要注意空格问题)
注意:条件非空即为true,[hello]返回true,[]返回false
举例:可以看到使用 $?得到的值是0,表示上一个命令正确。
否则的话返回的就是非0值,表示上一次命令不正确,也就是判断失败了。
也可以使用第二种方法,这里注意就是,[ ]符号里面的空格问题。
4.2 常用的判断条件
4.2.1 字符串等非数值比较
= 等于判断
!= 不等于判断
4.2.2 两个整数之间的比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
4.2.3 按照文件权限进行判断
-r 有读的权限 (read)
-w 有写的权限 (write)
-x 有执行的权限 (execute)
4.2.4 按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规文件(file)
-d 文件存在并且是一个目录 (directory)
4.2.5 多条件判断
&&表示前一条命令执行成功时,才执行后一条命令。
||表示上一条命令执行失败后,才执行下一条命令
上面的语句功能类似于 if ... else ...
5 流程控制
5.1 if判断
基本语法: