Shell编程学习笔记

Shell编程学习笔记

      • 解释器
      • Shell 变量:
        • Shell字符串
      • Shell 传递参数
      • Shell数组
      • Shell基本运算符
      • 条件表达式
      • 关系运算符
      • 布尔运算符
      • 逻辑运算符
      • 字符串运算符
      • 文件测试运算符
      • Shell echo命令
        • 基本输出
        • 变量显示
        • 开启转义
        • 显示结果定向到文件
        • 用单引号时,原样输出字符串,不进行转义或取变量
        • 显示执行命令结果

解释器

#!/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

还会继续更新,敬请期待。。。

你可能感兴趣的:(Shell编程)