day17

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"
1
2
注意:刚建好文件.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
1
2
3
3、shell进阶(重点)
1、变量
在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的。
例如:
定义形如:
class_name=“yunwei”
echo $class_name;

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

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

输出:hello ,其实不加引号也是可以的
1
2
3
4
5
单引号只能原样输出,且不能实现转义:

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

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

#!/bin/bash
str=`date "+%F %t"`
echo $str
1
2
3
注:此处需要加上反引号(esc键下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”。

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

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

#!/bin/bash
a=10
readonly a;
1
2
3
(3)接受用户输入(重点)
语法:read -p 提示信息 变量名

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

#!/bin/bash
read -p "请输入文件路径" filepath
touch $filepath
echo "文件创建完成"
1
2
3
4
(4)删除变量
语法:unset 变量名

2、条件判断语句
语法1:

if contion
then
    command1
    command2
    ...
fi
1
2
3
4
5
6
语法2:

if contion1
then
    commamd1
elif contion2
then
    command2
else
    command3
fi
1
2
3
4
5
6
7
8
9
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建下边
1
2
3
4
5
6
7
#!/bin/bash
a=10
b=10
echo "a+b:" expr $a + $b
1
2
3
4
案例:

#!/bin/bash
a=10
b=10
if [ $a == $b ]
then
    echo "a==b"
else
    echo "a!=b"
fi
注意:if和[]之间也有空格 
1
2
3
4
5
6
7
8
9
10
(2)关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
常见的关系运算符:
-eq:检测两个数是否相等,相等返回true (equal)
-ne:检测两个数是否不相等,不相等返回true (not equal)
-gt:检测左边数是否大于右边的数 (great than)
-lt:检测左边的数是否小于右边的数 (less than)
-ge:检测左边的数是否大于等于右边的数
-le:检测左边的数是否小于等于右边的数

#!/bin/bash
if [ $a -eq $b ]
...
1
2
3
(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
接受:
在脚本中可以使用"$1"来表示a,"$2"来表示b,以此类推,即:接受可以使用"$"加上选项对应的序号即可。$0表示本文件。
在test.sh中:

#!/bin/bash
echo $1 $2 $3
输出结果是:a b c
如果加上$0,最后会输出:
./test.sh a b c
1
2
3
4
5
上述例子就是:传递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之前缺少一个-;
还有:比较字符串是否相等时使用的是=,一个等于号
1
2
3
4
5
6
7
8
9
10
传递:

./test.sh -add user01
1
还需要使用到别名:因为题目中要求是指令
别名的用法:

vim ~/.bashrc 
在该文件中按示例添加一行:
alias user="/root/test.sh"
写完之后保存即可
1
2
3
4
之后直接在命令行输入以下就可以了:

#user -add user01
————————————————
版权声明:本文为CSDN博主「wsxyerr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wsxye18730291676/article/details/105932307

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Day17 中,我们可以通过 Flask 框架快速搭建一个 BBS 论坛。具体步骤如下: 1. 创建 Flask 应用 ```python from flask import Flask app = Flask(__name__) ``` 2. 创建数据库 ```python from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///bbs.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) ``` 3. 创建数据库模型 ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) password = db.Column(db.String(20), nullable=False) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) ``` 4. 创建路由和视图函数 ```python @app.route('/') def index(): posts = Post.query.all() return render_template('index.html', posts=posts) @app.route('/post/<int:post_id>') def post(post_id): post = Post.query.get(post_id) return render_template('post.html', post=post) @app.route('/new_post', methods=['GET', 'POST']) def new_post(): if request.method == 'POST': title = request.form['title'] content = request.form['content'] user_id = 1 # 假设当前用户为 id 为 1 的用户 post = Post(title=title, content=content, user_id=user_id) db.session.add(post) db.session.commit() return redirect('/') return render_template('new_post.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username, password=password).first() if user: session['user_id'] = user.id return redirect('/') else: flash('用户名或密码错误') return render_template('login.html') @app.route('/logout') def logout(): session.pop('user_id', None) return redirect('/') ``` 5. 创建 HTML 模板 创建 index.html、post.html、new_post.html、login.html 四个模板文件,并且使用 jinja2 模板引擎渲染数据。 6. 运行应用 ```python if __name__ == '__main__': app.run() ``` 以上就是快速搭建 BBS 论坛的主要步骤,当然在实际应用中还需要考虑更多细节问题,比如用户认证、数据校验、页面美化等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值