Shell编程学习笔记
解释器
#!/bin/sh
或者
#!/bin/bash
写在文件开头表示使用Bash Shell脚本解释器
Bash(Bourne Again Shell)
Shell 变量:
变量名和等号之间不能有空格!!!
使用定义过的变量,只要在变量名前加美元符号即可,即’$’
$var
或
${var}
加花括号是为了帮助解释器识别变量边界
使用readonly命令可以将变量定义为只读变量,
例:
var=0
readonly var
使用unset命令删除变量,变量被删除后不能再次使用
但该命令不能删除只读变量
Shell字符串
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字符串中不能出现单独一个单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串:
str0="man"
#双引号拼接
str1="hello , "$str0" !"
str2="hello , ${str0} !"
#单引号拼接
str3='hello , '${str0}' !'
获取字符串长度
${#str}
提取字符串
${str:1:4} #从第2个字节起提取四个字符
读取数组
${数组名[下标]}
下标使用@可以获取数组中的所有元素
Shell 传递参数
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
Tips:其中$0为执行的文件名
还有几个特殊字符用来处理参数:
字符 | 意义 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$- | 显示Shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令退出状态。0表示没有错误,其他任何值表明有错误 |
Shell数组
Bash Shell只支持一维数组,初始化时不需要定义数组大小。
Shell数组用括号表示,元素之间用空格分开
Array_name=(value1 value2 … valueN)
或者是
Array_name[0]=value0
Array_name[1]=value1
…
Shell基本运算符
原生的Bash不支持简单的数学运算,但可以通过其他命令来实现,例如awk和expr,其中expr最常用。
expr是一款表达式计算工具,使用它完成表达式的求值操作。
例如:
Value=`expr 2 + 2`
注意:
*表达式和运算符之间要有空格
*完整的表达式要被``反引号包含,在Esc键下面。
条件表达式
要放在方括号之间,并且要有空格
[ $a == $b ]
[ $a != $b ]
关系运算符
字符 | 意义 |
---|---|
-eq | 检测两个数是否相等,相等返回true |
-ne | 检测两个数是否不相等,不相等返回true |
-gt | 检测左边的数是否大于右边的,如果是,则返回true |
-lt | 检测左边的数是否小于右边的,如果是,则返回true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回true |
-le | 检测左边的数是否小于等于右边的,如果是,则返回true |
例如:
A=10
B=20
if [ $A -eq $B ]
then
Echo “ $A -eq $B : A等于B ”
fi
布尔运算符
字符 | 意义 |
---|---|
! | 非运算,表达式为true则返回false,否则返回true |
-o | 或运算,有一个表达式为true则返回true |
-a | 与运算,两个表达式都为true才返回true |
逻辑运算符
字符 | 意义 |
---|---|
&& | 逻辑的AND |
|| | 逻辑的OR |
字符串运算符
字符 | 意义 |
---|---|
= | 检测两个字符串是否相等,相等返回true |
!= | 检测两个字符串是否相等,不相等返回true |
-z | 检测字符串长度是否为0,为0返回true |
-n | 检测字符串长度是否为0,不为0返回true |
$ | 检测字符串是否为空,不为空返回true |
文件测试运算符
字符 | 意义 |
---|---|
-b file | 检测文件是否为块设备文件,如果是,则返回true |
-c file | 检测文件是否为字符设备文件,如果是,则返回true |
-d file | 检测文件是否为目录,如果是,则返回true |
-f file | 检测文件是否为普通文件,如果是,则返回true |
-g file | 检测文件是否设置了SGID位,如果是,则返回true |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true |
-p file | 检测文件是否有名管道,如果是,则返回true |
-u file | 检测文件是否有SUID位,如果是,则返回true |
-r file | 检测文件是否可读,如果是,则返回true |
-w file | 检测文件是否可写,如果是,则返回true |
-x file | 检测文件是否可执行,如果是,则返回true |
-s file | 检测文件是否为空,不空返回true |
-e file | 检测文件(包括目录)是否存在,如果是,则返回true |
其他检测符:
字符 | 意义 |
---|---|
-S | 判断文件是否socket |
-L | 检测文件是否存在并且是一个符号链接 |
Shell echo命令
基本输出
echo string
或者是
echo "string"
我个人推荐使用带引号的方式,因为能更清晰地知道打印的是哪部分
变量显示
#!/bash/sh'
read temp
echo "$temp"
开启转义
#!bin/sh
echo -e "OK! \n" # -e 表示开启转义
echo " Test"
#输出结果为
OK!
Test
显示结果定向到文件
echo "Test" > file
用单引号时,原样输出字符串,不进行转义或取变量
echo '$name\"'
#输出结果为
$name\"
显示执行命令结果
echo `date` #注意此处用的是反引号!!!不是单引号
#输出结果为
2019年 12月 16日 星期一 16:55:17 CST
还会继续更新,敬请期待。。。