目录
【shell的概述】
1.什么是shell
shell的本质其实就是脚本文件,主要用来做批量处理
从两个角度来看,shell即是编程语言,又是软件。
以软件的角度来看:shell命令解析器(sh ash bash解析器等)主要用来解析shell脚本文件
以语言的角度来说:shell是脚本语言。但是shell和Linux的命令还是有区别的。
2.系统默认调用的脚本文件
/etc/profile 对系统中所有的用户生效
~/.bashrc 对登录的用户有效
两者之间还是有区别的:第一个脚本文件的修改会对所有用户产生影响,而第二个脚本文件仅仅会影响当前用户。其中“/”表示根目录下,“~”表示家目录,较好理解。
3.shell脚本的创建及规范
在Linux命令行的格式下,使用如下方法创建shell脚本
vim 00shell.sh
脚本的第一行通常是用来指定解析器的,可以选择sh,ash或者bash解析器
#! /bin/bash #选择根目录下的bash解析器
有时候,生成的shell脚本会出现如下情况,在输入命令ls -lh 查看当前目录下文件以及权限的时候,会发现当前的shell脚本没有x权限,也就是没有执行权限。
图中三类用户权限分别为:文件拥有者权限、用户组权限、其他用户权限。
如何解决shell脚本文件确实可执行权限的问题。执行如下命令
通俗的来讲,就是直接为脚本文件直接添加执行权限。
chmod +x 00_shell.sh
修改后,三类用户权限均有可执行权。
shell脚本的定义步骤
1.在脚本第一行指明使用的解析器
2.编写脚本
3.添加可执行权限(如果缺失的话)
chmod +x 脚本名
4.执行脚本文件
脚本文件有三种执行方法
./00shell.sh #检测脚本第一行,使用第一行规定的解析器
. 00shell.sh #使用当前解析器解析
bash 00shell.sh #使用命令指定的解析器解析
【shell的变量】
1.变量的定义
不同于一般的编程语言,shell的变量定义是不需要指明类型的。
变量定义如下
几个注意点
定义变量的时候,后面不要加分号
!!定义变量的时候,不能这样定义 num = 10 等于号两边不能有空格,否则是错误的
num=10
如果想要访问变量,记得给变量美刀($)
#定义变量
num=10
#取变量的值
echo $num
#对变量写操作
num=1000
echo $num
变量的清除
如果想要清除一个变量,那么使用如下命令
unset num
!
使用unset清除变量,如果清除到环境变量会很危险
2.获取键盘输入
shell获取键盘输入使用 read ,并且不在需要定义变量。
#! /bin/bash
echo "请输入值"
read num
echo "num = $num"
echo "请输入两个值"
read num1 num2
echo "num1 = $num1 num2 = $num2"
似乎对值的输入无法识别空格,当输入两个数字的时候,第一个可以成功识别,但是会把后面的均作为第二个的值。
3.只读变量
类似于C语言中使用const修饰的变量,只有在定义的时候赋值,后面不可以在对他进行修改。
定义变量的时候,使用readonly修饰,变量为只读变量
readonly num=100
4.脚本变量导出为环境变量
环境变量相当于系统默认定义的变量?比如说home,就默认为家路径这样。
env命令查看当前系统环境变量
如何将自定义变量导出为环境变量
使用export修饰,可以导出自定义变量为环境变量
export num=100 #把自己的变量导出为环境变量
想要成功导出,那么运行的时候就不能再使用那三种方法运行,而是需要使用如下命令
source执行脚本,似乎是在当前shell进程中逐行执行脚本,并且可增加变量的有效期
source 00_shell.sh
5.脚本变量的注意事项
5.1.命名规则
注意=的两边不能有空格,以及每一句命令后面不能有分号
5.2." " 以及 ' '的区别
" " 包含起来会解析变量的值,前提是加$
‘ ’单纯是字符串,不会有任何解析
5.3.环境变量的修改
假如有一个环境变量为NUM,值为10。如果直接命令修改NUM=20,那么会直接覆盖之前的值。假如需要追加环境变量中,某个路径的值,那么可能不小心会直接覆盖之前的路径,十分危险。
正确追加修改环境变量的方法
export NUM=$NUM:20
#意思是把原本的NUM的值加上新的值赋值给NUM
【shell的预设变量】
关于这个预设变量,个人理解为,系统中关于这个脚本的一些参数,为了方便使用以及查看,使用一些特殊符号作为这些内容的变量?。然后需要使用的时候在解析(加$)
$#为传给shell脚本的参数的数量,$*为传入参数内容,而$加上数字分别为传入参数内容。
#!/bin/bash
echo "传入的数量为:$#"
echo "传入的内容为:$*"
echo "参数1为:$1"
echo "参数1为:$2"
$?预设变量
$?预设变量可以返回上一条语句执行的结果。成功返回0,失败为1
【shell脚本的特殊用法】
1.反引号的作用
反引号在exc键下方
反引号可以在shell脚本中解析Linux命令。
输出今天是星期几
把前面today is 和date系统命令解析一起显示出来
echo "todat is `date`"
2.shell中的转义字符
shell中的转义字符和C语言相同,唯一不用的是,shell中使用转义字符需要添加 -e
echo -e "##\n##"
3.shell中的(){}
()会重新开一个子shell执行,可以理解为,()中的子shell是独立于当前的shell的。
{}则是对{}内的命令在当前shell里面执行
【条件测试】
1.条件测试的概述
条件测试在shell中的应用还是比较重要的。条件测试有很多种,文件测试、字符串测试、数值测试、复合测试等
条件测试的关键字test
test具有以下的语法规则
1.
test 命令
2.
[ 命令 ] #命令的左右均有空格
2.文件测试
文件测试经常用来判断当前路径或者目录下的的文件。通过附加的选项可以判断多种情况。
具体的附加选项如下图
文件测试的基本语法规则
#判断当前路径下是否存在test.txt这个文件
test -e test.txt
#使用预设变量读取上一条语句的返回值,0表示存在1反之
echo “$?”
3.字符串测试
shell中,字符串测试在本人看来与C语言的字符串比较操作等很类似。无非就是比较两个字符串是否相等或者字符串是否为空。
字符串测试的基本语法规则
#定义一个字符串
str=""
#进行字符串判断
test -z $str
#取上一条语句结果
echo "$?"
字符串操作扩展
4.数值测试
数值测试主要用来判断两个数值是否相等,分别可以使用两个测试方法的数值测试
test 命令
test num1 附加选项 num2
#通过附加选项来判断两个数字
[]命令
[ num1 附加选项 num2 ]
附加选项有以下几种:
5.复合测试
复合测试相当于逻辑与或者逻辑或,同时也具有短路特性。
&&只有当左边的命令执行成功才会执行右边的,否则就算执行右边的也无意义。
||只有左边没有成功才执行右边,否则无需执行右边的。