目录

一、shell的基本组成元素

二、变量

1、变量的分类

2、变量的设置

3、变量的引用

4、变量的替换

5、变量的清除

6、变量的作用域

7、类型变量

8、数组

9、变量的叠加

三、各种符号

1、文件名替换

2、命令代换

3、算数代换

4、转义字符

5、单引号

6、双引号

四、shell的基本语法

1、条件判断语句

2、循环语句

3、其它流程控制

五、shell输入和输出

六、bash高级应用

1、临时文件产生和读写

2、锁文件概念

3、输入输出流操作

4、bash shell 的调试方法


一、shell的基本组成元素

#!:出现在脚本第一行,用于定义命令解释器

#:除了第一行以外,其他以#开头的行是注释。这些行不被运行,只是给人阅读使用

系统命令:shell脚本中运行解释的系统命令

流量控制语句:判断、循环、跳转等流量控制

二、变量

1、变量的分类

本地变量:在一个用户的shell的生命周期中所有效的变量,可以使用set显示本地变量

环境变量:用于所有用户进程(经常成为子进程),登陆进程称为父进程。shell中运行的用户进程称为子进程,环境变量可以用于所有子进程。可以使用env显示环境变量

HOME 用户的家目录 PS1 第一提示符

PATH 可执行文件搜索路径 PS2 第二提示符

LOGNAME 用户登录名 PWD 当前路径

MAIL 用户的邮箱 SHELL 当前所使用的shell

位置变量:有很多特殊变量是被Shell自动赋值的,比如:

$0 相当于C语言main函数的argv[0]

$1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...

$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释,代表传递的参数的个数

$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。

$* 表示参数列表"$1" "$2" ...,同上

$? 进程运行结束返回值变量$?:运行正确返回0,运行错误返回非0

$$ 进程ID变量$$:可以用来判断程序的当前状态或者对程序做相应的kill操作等等

位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不用移动。不带参数的shift相当于shift 1。例如:

#!/bin/bashecho "The program $0 is now running"
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The parameter list is $@"
shift
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The parameter list is $@"# 执行
./test.sh 0 1 2The program ./test is now running
The first parameter is 0
The second parameter is 1
The parameter list is 0 1 2
The first parameter is 1
The second parameter is 2
The parameter list is 1 2

2、变量的设置

设置变量:VARNAME=VAR_VALUE

设置只读变量:readonly VARNAME=VAR_VALUE

3、变量的引用

echo ${VARNAME}

echo $VARNAME

4、变量的替换

${VARNAME:+VAR}:如果设定了VARNAME,则显示为VAR,否则为空

${VARNAME:?VAR}:如果未设定VARNAME,则显示用户定义错误信息VAR

${VARNAME:-VAR}:如果未设定VARNAME,则显示其值为VAR

${VAENAME:=VAR}:如果未设定VARNAME,则设定其值并显示为VAR

5、变量的清除

unset VARNAME

6、变量的作用域

全局变量:声明全局变量需要使用export,如果其他进程(非子进程)需要调用,则应该使用“.”或“source”调用

export VARNAME=VAR_VALUE

局部变量:函数内变量,如果要使函数内定义的变量只在函数内生效,则要使用local关键字

local kevin=kevin_foo

7、类型变量

有类型的变量:默认bash将变量设置为文本值,当使用算数方法时会自动将其转换为整数值,内置命令declare可以修改变量属性

declare参数

-a 将变量看成数组

-f 只是用函数名

-F 显示未定义的函数名

-i 将变量看成整数

-r 是变量只读

-x 标记变量未通过环境导出

整数变量:bash将$((和))包围的单词解释为算数表达式

常见的算数操作符:

+

-

*

/ 除(取整)

% 取余

<< 左移位

>> 右移位

& 位与

| 位或

~ 位非

! 位非

^ 位异或

常见的关系操作符:

< -lt

> -gt

<= -le

>= -ge

== -eq

!= -ne

&& 逻辑与

|| 逻辑或

8、数组

数组类似于保存取值的一个排列,排列中每个位置成为元素,每个元素通过数字下标访问。数组元素可以包含字符串或数字,数组下标从0开始

9、变量的叠加

三、各种符号

1、文件名替换

这些用于匹配的字符称为通配符(Wildcard),具体如下:

通配符

* 匹配0个或多个任意字符

? 匹配一个任意字符

[若干字符] 匹配方括号中任意一个字符的一次出现

2、命令代换

由'`'反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。

3、算数代换

用于算术计算,$(())中的Shell变量取值将转换成整数,同样含义的$[]等价例如:

itcast$ VAR=45
itcast$ echo $(($VAR+3))

$(())中只能用+-*/和()运算符,并且只能做整数运算。 $[base#n],其中base表示进制,n按照base进制解释,后面再有运算数,按十进制解释。

echo $[2#10+11]
echo $[8#10+11]
echo $[10#10+11]

4、转义字符

比如创建一个文件名为“$ $”的文件可以这样:

itcast$ touch \$\ \$

5、单引号

和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。

单引号用于保持引号内所有字符的字面值,即使引号内的 \ 和回车也不例外,但是字符串中不能出现单引号。

itcast$ echo '$SHELL'
$SHELL
itcast$ echo 'ABC\(回车)
> DE'(再按一次回车结束命令)
ABC\
DE

6、双引号

被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。

itcast$ DATE=$(date)
itcast$ echo "$DATE"
2021年 01月 07日 星期四 14:44:45 CST
itcast$ echo '$DATE'
$DATE

四、shell的基本语法

1、条件判断语句

if/then/elif/else/fi

if condition
thenstatemnets...
elif conditionthenstatements...
elsestatements...
fi    

2、循环语句

for/do/done

for name in list
dostatements that can use $name...
done 

while/do/done while条件为真循环才执行

while condition
dostatemnts...
done

until until条件为假循环才执行

until command;dostatements...
done 

3、其它流程控制

case/esac 任何pattern实际上都是可以有管道符号分割的几个模块组成,同时可以使用*号作为表达式匹配,可以使用?匹配任意单个

case expression inpattern 1)statements;;pattern 2)statements;;...pattern N)statements;;
esac  

continue 跳到for、while、until循环的下一步,继续执行循环,直到循环结束跳出

break 从for、while、until循环中退出,break[n]可以指定跳出几层循环

shift 参数移位

function 函数可以带参数,比如functname A B,那么函数中的S1=A,$2=B

functname()
{shell commands
}

test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1

[ $var -gt 3 ]

五、shell输入和输出

echo:echo显示文本行或变量,或者把字符串输入到文件。

echo [option] string

-e 解析转义字符

-n 不回车换行

管道 | :可以通过管道把一个命令的输出传递给另一个命令做输入。

cat file | more
ls -l | grep "file"
df -k | awk '{print $1}' | grep -v "devtmpfs"
# df -k 查看磁盘空间,找到第一列,去除“devtmpfs”并输出

tee:tee命令把结果输出到标准输出,另一个副本输出到相应文件。

df -k | awk '{print $1}' | grep -v "文件系统" | tee a.txttee -a a.txt表示追加操作
df -k | awk '{print $1}' | grep -v "文件系统" | tee -a a.txt

文件重定向

cmd > file             把标准输出重定向到新文件中
cmd >> file            追加
cmd > file 2>&1        标准出错也重定向到1所指向的file里
cmd >> file 2>&1
cmd < file1 > file2    输入输出都定向到文件里
cmd < &fd              把文件描述符fd作为标准输入
cmd > &fd              把文件描述符fd作为标准输出
cmd < &-               关闭标准输入

六、bash高级应用

1、临时文件产生和读写

我们经常需要在脚本运行过程中产生一些临时文件,创建临时文件的命令很多,但不是所有的都是用,比如vi是一个交互式命令,不适合在脚本内部使用。

可以用cat命令:

#!/bin/bashcat /tmp/file/<<ENDF
welcome
${whoami}
ENDF
# ENDF是一个自定义的结束符,可以自由定义

2、锁文件概念

锁是一种程序与程序之间协同工作的一种机制。

比如程序可以在运行之时创建一个锁文件,当你想知道自己的脚本当前有没有运行,可以判断这个锁文件是否存在。

锁文件分为简单锁文件和复杂锁文件。

简单锁文件:

if [ if "$LOCKFILE" ]
thenecho "script is running." && exit 1
elsetouch "$LOCKFILE"
fi  

简单锁的问题时,如果脚本一场瑞出,而所文件没有删除,则下次执行脚本会认为自己已经运行,从而不在运行。所以需要使用复杂锁:

if [ -f "$LOCKFILE" ] //假如锁文件存在
thenpid=`cat $LOCKFILE`  //查看锁文件中的PID值[ -n "$pid" ] && ps -p $pid | grep $pid >/dev/null  //比较PID是否一致[ $? = 0 ] && echo "script is running." && exit 1  //PID一致,显示运行信息,并退出脚本
fiecho $$ > "$LOCKFILE"  //如果锁文件不存在,或者存在但PID不一致,则将新的PID写入锁文件

3、输入输出流操作

逐行读取一个文件,并进行一定的操作,我们可以称之为流操作。

#!/bin/bashwhile read LINE
doecho $LINEsleep 1
done < /etc/hosts 

4、bash shell 的调试方法

常见的方法:使用调式参数、使用read设置端点、使用echo查看变量值。

打开调试参数:

set -x bash -x test.sh

关闭调试参数:

set +x bash test.sh

脚本头目定义方式;:

#!/bin/bash -vx

其它:

set -f //禁止特殊字符用于文件扩展名

set -v //打印读入shell的输入行

set -x //执行命令前打印命令

Shell基本应用(学习笔记)相关推荐

  1. shell脚本编程学习笔记6(xdl)——字符串截取命令

    shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...

  2. shell脚本编程学习笔记8(XDL)——流程控制和循环

    shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...

  3. shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()

    shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...

  4. shell脚本编程学习笔记5(xdl)——正则表达式

    shell脚本编程学习笔记5--正则表达式 1,简介 正则表达式,用来在文件中匹配符合条件的字符串,包含匹配.注意是文件中选择字符串,和通配符是 不同的.grep,awk,sed等命令可以支持正则表达 ...

  5. shell脚本编程学习笔记2(xdl)——Bash变量

    shell脚本编程学习笔记2--Bash变量 1,变量简介 1,计算机内存单元2,设置规则字母数组下划线组成,不能以数字开头Bash中,默认类型字符串型,变量类型可修改 2,Bash变量规则 1,变量 ...

  6. shell脚本编程学习笔记4(xdl)——Bash常见环境变量

    shell脚本编程学习笔记4--Bash常见环境变量 非专业运维,例如开发人员,环境变量熟悉常见的,了解不常见的即可. 1,简介 环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量, ...

  7. shell脚本编程学习笔记7(XDL)——字符处理命令和条件判断

    shell编程学习笔记--字符处理命令和条件判断 1,字符处理 [root@localhost ~]# sort [选项] 文件名 选项: -f: 忽略大小写 -n: 以数值型进行排序,默认使用字符串 ...

  8. shell脚本编程学习笔记(四)shell操作数据库

    一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...

  9. Linux Shell脚本编程学习笔记和实战

    http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...

  10. Shell脚本的学习笔记一:变量

    三种变量: 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需 ...

最新文章

  1. 清华学姐的研究生复试经验!
  2. 继承机制中的构造器和析构器 - C++快速入门17
  3. 2.2 理解 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  4. Matlab中特征选择reliefF算法使用方法(分类与回归)
  5. 根据条件查询某条记录的条数_「性能与架构」MySQL 8 查询优化新工具 Explain Analyze...
  6. Linux内核源码分析方法
  7. 在给定总和K的二叉树中找到级别
  8. cloc统计想项目行数
  9. mysql系统特性_MySQL · 引擎特性 · InnoDB 事务系统
  10. python-3高级特征
  11. wp转shp_将china.wl拓扑生成的wp面转换成shp格式,然后在arcgis中打开,截图,提交截图。...
  12. c语言设计四路彩灯显示系统,数字电路逻辑设计课程设计-四路彩灯显示系统设计...
  13. java 电子书下载
  14. 怎样用自己电脑搭建网络服务器!不花一分钱
  15. 读债务危机0814-08年9月崩溃
  16. ClickHouse技术分享第二弹(英文讲义)
  17. dubbo-go 中如何实现远程配置管理?
  18. matlab 野值剔除,一种基于多项式拟和的野值剔除方法与流程
  19. Web MIDI简介
  20. 3d建模基础入门教程,3D建模各行业之间的发展趋势

热门文章

  1. Kubernetes 学习总结(23)—— 2022 年 Kubernetes 的 5 个趋势
  2. Spring Boot学习总结(5)——SpringBoot Jar应用Linux后台部署执行
  3. php遍历原理,PHP数组遍历与实现原理
  4. captcha2 验证码 php,Yii2增加验证码步骤详解
  5. spark 存入hbase_Spark DataFrame写入HBase的常用方式
  6. Python Day42
  7. dockerfile 创建自定义的tomcat服务
  8. Python重写C语言程序100例--Part6
  9. 推荐10款 好用的 Jquery 评分插件
  10. WordPress企业主题:BDV适合于小型公司、企业,主要以产品类为主