Linux_shell基础

注意, 这里在运行时一定要写成./test.sh,而不是 test.sh, 运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

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

Linux_shell基础

脚本执行的另外一个方式:/bin/bash 脚本的路径(了解)

Linux_shell基础

Shell脚本分为简单的写法(简单命令的堆积)和复杂写法(程序的设计)

三、shell进阶(重点)

1、变量(重点)

1.1、变量的含义

a. 什么是量:量就是数据.

b. 什么是变量:数据可以发生改变就是变量.

在一个脚本周期内, 其值可以发生改变的量就是变量.

c. 什么叫做一个脚本周期:一个脚本周期我们可以简单的理解为当前的shell文件

变量是shell中不可或缺的一部分,也是 最基础、最重要的组成部分。

1.2、变量的定义与使用(重点)

变量,先定义后使用。

定义形如:class_name =”yunwe “

使用形如:echo $class_name

变量就是由2部分组成,一个是变量名(左边),另外一部分是变量的值(右边)

在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的(例如php)。

变量名的规范:

请注意,变量名后的等号周围不能有空格,这可能与您熟悉的所有编程语言不同。同时,变量名的命名必须遵循以下规则:

[En]

Note that there can be no spaces around the equal sign after the variable name, which may be different from all the programming languages you are familiar with. At the same time, the naming of variable names must follow the following rules:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

中间不能有空格,可以使用下划线”“。_

不能使用标点符号。

不能使用bash里的关键字(可用help命令查看保留关键字)。

案例1:使用变量改写入门脚本中的第1个shell脚本。

Linux_shell基础

Linux_shell基础

关于单双引号的问题:

双引号能够识别变量,双引号能够实现转义(类似于”* “)

单引号是不能识别变量,只会原样输出,单引号是不能转义的

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

Linux_shell基础

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

Linux_shell基础

1.3、只读变量(了解)

语法:readonly 变量名

案例:定义变量a并且其值为10,随后设置其为只读变量,再去尝试重新赋值

Linux_shell基础

Linux_shell基础

1.4、接收用户输入(重点)

语法:read -p 提示信息 变量名

案例:编写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件

Linux_shell基础

Linux_shell基础

1.5、删除变量(了解)

语法:unset 变量名path

案例:定义变量b=20,再输出b的值,随后删除b,最后再输出下b

Linux_shell基础

Linux_shell基础

2、条件判断语句

语法1(一个条件):

if condition

then

command1

command2

fi

单行写法(一般在命令行中执行的时候):if [ condition ]; then command; fi

语法2(两个条件):

if condition

then

command1

command2

else

command

fi

语法3(多个条件):

if condition1

then

command1

elif condition2

then

command2

else

commandN

fi

3、运算符

在shell中,运算符和其他编程脚本语言一样,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、 文件测试运算符

3.1、算数运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符

说明

举例

+

加法

expr $a + $b 结果为 30。

减法

expr $a - $b 结果为 -10。

*

乘法

expr $a \* $b 结果为 200。

/

除法

expr $b / $a 结果为 2。

%

取余

expr $b % $a 结果为 0。

=

赋值

a=$b 将把变量 b 的值赋给 a。

==

相等。用于比较两个数字,相同则返回 true(真)。

[ $a == $b ] 返回 false(假)。

!=

不相等。用于比较两个数字,不相同则返回 true。

[ $a != $b ] 返回 true。

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

原生bash不支持简单的数学运算 ,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ‘):

!/bin/bash

val=expr 2 + 2

echo “两数之和为 : $val”

两点注意:

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

3.2、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符

说明

举例

-eq

检测 两个数是否相等,相等返回 true。

[ $a -eq $b ] 返回 false。

-ne

检测 两个数是否相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

检测左边的数 是否大于右边的,如果是,则返回 true。

[ $a -gt $b ] 返回 false。

-lt

检测左边的数 是否小于右边的,如果是,则返回 true。

[ $a -lt $b ] 返回 true。

-ge

检测左边的数 是否大于等于右边的,如果是,则返回 true。

[ $a -ge $b ] 返回 false。

-le

检测左边的数 是否小于等于右边的,如果是,则返回 true。

[ $a -le $b ] 返回 true。

-eq:equal

-ne:not equal

-gt:great than

-lt:less than

-ge:great than or equal

-le:less than or equal

案例:使用a=10,b=20来实现本案例

Linux_shell基础

Linux_shell基础

案例:编写一个脚本来确定当前输入的用户是否存在。如果存在,则提示“用户存在”或“用户不存在”。

[En]

Case: write a script to determine whether the currently entered user exists. If it exists, it prompts “user exists” or “user does not exist”.

Linux_shell基础

3.3、逻辑运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符

说明

举例

!

非运算,表达式为 true 则返回 false,否则返回 true。

[ ! false ] 返回 true。

-o

或(或者)运算, 有一个表达式为 true 则返回 true

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a

与(并且)运算, 两个表达式都为 true 才返回 true。

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

或运算:一个为真即为真 ,全部为假才是假

与运算:一个为假即为假 ,全部为真才是真

Linux_shell基础

3.4、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符

说明

举例

=

检测两个字符串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

检测两个字符串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

检测字符串长度是否为0,为0返回 true。

[ -z $a ] 返回 false。

-n

检测字符串长度是否为0,不为0返回 true。

[ -n $a ] 返回 true。

str

检测字符串是否为空,不为空返回 true。

[ $a ] 返回 true。

Linux_shell基础

3.5、文件测试运算符(重点)

文件测试运算符用于检测 Unix/Linux 文件的各种属性。

属性检测描述如下:

操作符

说明

举例

-b file

检测文件是否是块设备文件,如果是,则返回 true。

[ -b $file ] 返回 false。

-c file

检测文件是否是字符设备文件,如果是,则返回 true。

[ -c $file ] 返回 false。

-d file

检测文件是否是目录,如果是,则返回 true

[ -d $file ] 返回 false。

-f file

检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true

[ -f $file ] 返回 true。

-g file

检测文件是否设置了 SGID 位,如果是,则返回 true。

[ -g $file ] 返回 false。

-k file

检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

[ -k $file ] 返回 false。

-p file

检测文件是否是有名管道,如果是,则返回 true。

[ -p $file ] 返回 false。

-u file

检测文件是否设置了 SUID 位,如果是,则返回 true。

[ -u $file ] 返回 false。

-r file

检测文件是否可读,如果是,则返回 true

[ -r $file ] 返回 true。

-w file

检测文件是否可写,如果是,则返回 true

[ -w $file ] 返回 true。

-x file

检测文件是否可执行,如果是,则返回 true

[ -x $file ] 返回 true。

-s file

检测文件是否为空(文件大小是否大于 0 ),不为空返回 true

[ -s $file ] 返回 true。

-e file

检测文件(包括目录)是否存在,如果是,则返回 true

[ -e $file ] 返回 true。

案例研究:测试上述增稠的效果

[En]

Case study: test the effect of the above thickening

Linux_shell基础

注意:有几种权限判断,如果只有一个部分满足,则认为它有权限。

[En]

Note: there are several judgments of permissions, and if only one part meets, it is considered to have permissions.

4、shell脚本附带选项(重点)

问题描述:在linux shell中如何处理tail -10 access.log这样的命令行选项?

步骤:

调用tail指令

系统把后续选项传递给tail

Tail先去打开指定的文件

取出最后10行

问题:自己写的shell是否也可以像内置命令一样传递一些选项呢?

答:是的,送货方式和上面描述的一样,关键是如何接收。例如:

[En]

A: yes, the delivery method is the same as the above description, the key is how to receive it. For example:

传递:

./test.sh a b c

接收:

在脚本中可以用”$1″来表示a,”$2″来表示b,以此类推。

接收可以用”$ “加上选项对应的序号即可。

测试:编写test14.sh,传递a,b,c,输出其值

Linux_shell基础

练习:创建自定义 指令” user ,可以直接执行,要求该指令具备以下语法和功能:

a. #user -add 用户名 【添加用户】

b. #user -del 用户名 【删除用户及其家目录】

Linux_shell基础

同时,标题中的要求是一种说明,因此您可以添加个人姓名:

[En]

At the same time, the requirement in the title is an instruction, so you can add an individual name:

Linux_shell基础

Original: https://www.cnblogs.com/zzc1102/p/16030182.html
Author: and脱发周大侠
Title: Linux_shell基础

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523982/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Kasini3000 batch modify the password for windows node

    https://gitee.com/chuanjiao10/kasini3000 win,linux devops automation batch script framewor…

    Linux 2023年6月13日
    0107
  • 统计算法_探索性统计

    最近不知道写什么了,基本python的各种功能百度一下,都能搜到一大把,最近itchat好像很火,不过对这个不是很感冒,等以后有兴趣或者用的上的时候研究研究准备把统计方面的东西再看…

    Linux 2023年6月6日
    092
  • 异常—异常安全问题–内存泄漏动图演示

    异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的 直接或间接的调用者处理这个错误。 throw: 当问题出现时,程序会抛出一个异常。这是通过使用…

    Linux 2023年6月13日
    093
  • Linux 查看运行中进程的 umask

    线上某台虚机因为故障重装了系统(基线 CentOS 6.9 内核 2.6.x),重新部署了应用。这个应用会生成一个文件,到NFS挂载目录。 而这个 NFS 挂载目录是一个 FTP …

    Linux 2023年6月14日
    099
  • Java实现两种队列(数组和链表)

    @date 2022-09-13 17:50*/public class QueueLinked{ private static class Node{E item;Node ne…

    Linux 2023年6月14日
    0141
  • 每周一个linux命令(tree)

    安装tree命令 yum install tree -y 显示当前目录下的一级目录结构 tree -L 1 目录信息说明 bin: 系统常用命令所在目录 boot: 系统启动相关的…

    Linux 2023年6月8日
    0104
  • Android中的Coroutine协程原理详解

    前言 协程是一个并发方案。也是一种思想。 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高。但是面对计算密集型的任务不如多线程并行运算效率高。 不同的语言…

    Linux 2023年6月13日
    0105
  • centos7安装redis设置开机启动

    首先下载redis源码,并使用tar进行解压缩 wget http://download.redis.io/releases/redis-4.0.8.tar.gztar xvzf …

    Linux 2023年5月28日
    0111
  • vi和vim文本编辑器

    vi和vim文本编辑器 vi和vim模式的相互切换 快捷键使用案例 拷贝当前行yy; 拷贝当前行向下的5行 5yy; 并粘贴(p) 删除当前行dd; 删除当前行向下的5行 5dd …

    Linux 2023年6月11日
    0105
  • SUPERVISOR监控tomcat配置文件

    下方为Supervisor管理tomcat的配置,多注意红色位置路径修改: [program:tomcat] ; 管理的子程序名字,要和项目有关联,不能乱写 command=/us…

    Linux 2023年6月6日
    0104
  • MySQL——用户和权限管理

    由用户名和主机名组成 格式:’user_name’@’host’ host必须要用引号括起来 注意:host可以是一个主机名也可以是…

    Linux 2023年6月7日
    099
  • 回顾乐信集团工作经历

    2019年入职乐信用户增长部门,负责开发开放平台的需求和合作方技术支持。乐信金融开放平台提供了金融业务API以及配套SDK等组件,为合作商户的产品赋予分期支付和小额贷款能力,子系统…

    Linux 2023年6月6日
    098
  • UE4在Windows下交叉编译打包Linux版本

    UE4在Windows下交叉编译打包Linux版本 我使用的是UE4.27.2,Windows 11,项目是一个 纯蓝图项目,所以打包过程没有什么阻碍。 首先上官网下载对应版本的工…

    Linux 2023年6月6日
    0113
  • 实验1:SDN拓扑实践

    实验1:SDN拓扑实践 基础要求 a) mininet运行结果图 b)2的执行结果截图 2.a)3台交换机,每个交换机连接1台主机,3台交换机连接成一条线。 2.b)3台主机,每个…

    Linux 2023年6月7日
    0107
  • Linux基础入门笔记

    Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统,是一…

    Linux 2023年6月14日
    073
  • WIN10下启动VMware虚拟机蓝屏的解决办法

    问题: 每次启动虚拟机就会蓝屏,提示错误代码: PAGE_FAULT_IN_NONPAGED_AREA 解决办法: 禁用 Hyper-V 功能 打开”控制面板&#821…

    Linux 2023年6月7日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球