Shell

shell

1、shell概念

Shell是一种C语言编写的程序,使用户使用Linux的桥梁,Shell即使一种命令语言又是一种编程语言。
shell是指一种应用程序,这个应用程序提供了一种界面,用户通过这个界面访问操作系统内核的服务。

Linux中默认的shell是/bin/bash (重点)。bash shell是大多数Linux系统默认使用的shell,是一个免费版本。

2、shell入门

编写规范:
(1)代码规范:
#!/bin/bash 就是指定解释器的路径。
shell相关指令
(2)文件命名规范:
文件名.sh

使用流程:
(1)创建一个.sh文件 touch/vim
(2)编写shell代码
(3)执行shell脚本 因此脚本必须具有执行权限

案例1: 创建test.sh,实现第一个shell脚本程序,输出hello.world
输出命令:echo
比如要输出123,则写成 echo 123,则会在屏幕上打印出123
注意输出内容:如果包含字母和符号(数字等),则需要用引号包括起来;但如果是纯数字,可以用引号也可以不用
还要注意:shell语言中一句结束可以加分号也可以不加分号

#!/bin/bash
echo "hello world"

注意:刚建好文件.sh后,可能没有执行权限,需要chmod u+x test.sh添加执行权限,然后才能继续执行。
执行时一定要写成./test.sh,而不是test.sh,运行其他二进制程序也这样,直接写成test.sh,Linux系统会去PATH(环境变量)里寻找有没有叫test.sh的。所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。

案例2: 使用root用户账号创建并执行test2.sh,实现创建一个shelltest用户,并在家目录创建文件try.html

#!/bin/bash
useradd shelltest
touch /home/shelltest/try.html

3、shell进阶(重点)

1、变量

在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的。
例如:
定义形如:
class_name=“yunwei”
echo $class_name;

(1)关于单双引号的问题:
双引号能够识别变量;而且还可以实现转义:

#!/bin/bash
str="hello";
echo "$str"

输出:hello ,其实不加引号也是可以的

单引号只能原样输出,且不能实现转义:

#!/bin/bash
str="hello";
echo ‘$str’

输出:$str 

案例1: 定义一个变量,输出当前时间,要求格式是“年-月-日 时:分:秒”:

#!/bin/bash
str=`date "+%F %t"`
echo $str

注:此处需要加上反引号(esc键下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”。

(2)只读变量
一旦定义就不能别修改了
语法:readonly 变量名

案例:定义一个变量a,并且其值为10,随后设置其为只读变量

#!/bin/bash
a=10
readonly a;

(3)接受用户输入(重点)
语法:read -p 提示信息 变量名

案例:编写一个脚本,要求执行之后提示用户输入一个文件的路径,自动为用户穿件该文件。

#!/bin/bash
read -p "请输入文件路径" filepath
touch $filepath
echo "文件创建完成"

(4)删除变量
语法:unset 变量名

2、条件判断语句

语法1:

if contion
then
	command1
	command2
	...
fi

语法2:

if contion1
then
	commamd1
elif contion2
then
	command2
else
	command3
fi
3、运算符

shell中,常见的运算符有算术运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等。

(1)算术运算符:
加减乘除、取余(%),赋值(=)、相等(==)相等返回true、不相等(!=)不相等返回true

注意: 条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b]是错误的,必须写成[ $a==$b ]。

原生的bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。
expr是一款表达式计算工具,使用它能完成表达式的求值操作。例如:

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为:$val"

两点注意:
表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2,这与我们熟悉的大多数编程语言不一样;
完整的表达式要被``包含,注意这个字符不是常用的单引号,在esc建下边
#!/bin/bash
a=10
b=10
echo "a+b:" expr $a + $b

案例:

#!/bin/bash
a=10
b=10
if [ $a == $b ]
then
	echo "a==b"
else
	echo "a!=b"
fi
注意:if和[]之间也有空格 

(2)关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
常见的关系运算符:
-eq:检测两个数是否相等,相等返回true (equal)
-ne:检测两个数是否不相等,不相等返回true (not equal)
-gt:检测左边数是否大于右边的数 (great than)
-lt:检测左边的数是否小于右边的数 (less than)
-ge:检测左边的数是否大于等于右边的数
-le:检测左边的数是否小于等于右边的数

#!/bin/bash
if [ $a -eq $b ]
...

(3)逻辑运算符
常见的逻辑运算符:
l:非运算,表达式为true,则返回false [ ! false ]
-o:或运算,有一个为真则为真 [ $a -lt 20 -o $b -gt 100 ]
-a:与运算

(4)字符串运算符
常见的字符串运算符,假定变量a为“abc”,变量b为“egf”:
=:检测两个字符串是否相等,相等返回true
!=:检测两个字符串是否不相等,不相等返回true
-z:检测字符串长度是否为0,为0返回true [ -z $a ]
-n:检测字符串长度是否不为0,不为0返回true
str:检测字符串是否为空,不为空返回true , [ $a ]返回true

(5)文件测试运算符(重点)
文件测试运算符用于检测Unix/Linux文件的各种属性。
属性检测描述如下:
-d file:检测文件是否是目录,如果是,则返回true [ -d $file ]
-f file:检测文件是否是普通文件(既不是目录也不是设备文件),
如 [ -f $file ]返回true
-r file:检测文件是否可读,如果是,返回true
-w file:检测文件是否可写
-x file:检测文件是否可执行
-s file:检测文件是否为空(文件大小是否大于0),不为空返回true
-e file:检测文件(包括目录)是否存在,如果是,则返回true

(6)shell脚本附带选项(重点)
在linux shell中如何处理tail -10 access.log这样的命令行选项呢??
步骤:
调用tail指令
系统把后续选项传递给tail
tail先去打开指定的文件
取出最后10行

问题:自己写的shell是否也可以像内置命令一样传递一些选项呢??
答:可以的,传递方式与上述的描述是一样的,关键是怎么接受。例如:
传递:

#./test.sh a b c

接受:
在脚本中可以使用"$1"来表示a,"$2"来表示b,以此类推,即:接受可以使用"$"加上选项对应的序号即可。$0表示本文件。
在test.sh中:

#!/bin/bash
echo $1 $2 $3
输出结果是:a b c
如果加上$0,最后会输出:
./test.sh a b c

上述例子就是:传递a b c ,输出其值,其中$1、$2是变量。

案例:
创建自定义指令"user" ,可以直接执行,要求该指令具备以下语法和功能:
a.#user -add 用户名 【添加用户】
b.#user -del 用户名 【删除用户及其家目录】

test.sh文件中:

#!/bin/bash
if [ $1 = '-add' ]
then 
	useradd $2
else
	userdel -r $2
fi

注意:是[ $1 = '-add' ]而不是[ $1 = 'add' ]add之前缺少一个-;
还有:比较字符串是否相等时使用的是=,一个等于号

传递:

./test.sh -add user01

还需要使用到别名:因为题目中要求是指令
别名的用法:

vim ~/.bashrc 
在该文件中按示例添加一行:
alias user="/root/test.sh"
写完之后保存即可

之后直接在命令行输入以下就可以了:

#user -add user01

选型的作用:可以帮助我们将一些复杂了命令直接写成一个,比如我们还可以判断用户是否存在,不存在再去创建

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页