Linux第十章 Shell基础

第十章 Shell基础


shell概述


在这里插入图片描述

  • shell 的概念
  1. shell 是一个命令解释器, 将内核与应用程序所要传达的信息, 通过 shell, 翻译成内核可识别的二进制码和用户可识别的命令.
    内核通过调用硬件, 完成操作, 硬件把执行结果返回给内核, 经 shell 解释, 返回给用户.
  2. shell 还是一个编程语言. 它是解释执行的脚本语言, 在 shell 中可直接调用 linux 系统命令.
  • shell 的分类

    • Bourne shell : 它的主文件名为sh
      • 主要包括 : sh, ksh, Bash, psh, zsh
    • C shell : 其语法和C语言相似
      • 主要包括 : csh, tcsh

    两种 shell 语法结构完全不相同, 两种语法彼此不兼容.

    Bash : Bash 与 sh 兼容, 现在 linux 使用的基本 shell 就是 Bash.

  • linux 支持的 shell

vi /etc/shells
{
	/bin/sh
	/bin/bash		:	系统默认的 shell
	/usr/bin/sh
	/usr/bin/bash
	/bin/tcsh
	/bin/csh
}

shell脚本的执行方式


  • echo输出命令
    echo [-e] "内容" : 输出内容
    -e : 支持转义符进行转义
字符作用
\ \输出\
\b退格键
\f换页符
\n换行键
\r回车键
\tTab键
  • 第一个脚本
vi hello.sh
{
	#!/bin/Bash		:	脚本的标称, 以下内容为 shell 脚本
	#the first program	:	注释
	
	echo "hello world"
}

.sh为脚本扩展名, 告ji诉系统此文脚本文件, 也可以不加, 建议加上, 方便识别.

  • 执行脚本
    • 赋予权限
      chmod 755 hello.sh
    • 执行
      ./hello.sh : 通过绝对路径或相对路径来执行

bash的基本功能


历史命令与命令补全

  • 历史命令
    history [参数] [历史命令保存文件]
    参数 :
    -c : 清空历史命令, 不建议使用
    -w : 把缓存中的历史命令写入历史命令保存文件~/.bash_history

该文件在家目录下, 且为隐藏文件, 用户退出之后才会将历史命令写入该文件中.

历史命令默认保存1000条, 可以在环境变量配置文件/etc/profile中进行修改.

vi /etc/profile
{
	HISTORY=1000	:	可手动改写
}
  • 历史命令的调用

使用上下箭头调用以前的历史命令.

  • 命令与文件补全

在 Bash 中, 只要早输入命令或文件时, 按Tab键就会自动补全.

命令别名与常用快捷键

  • 命令别名
    alias [别名='原命令'] : 设定命令别名
    alias : 查看系统所有命令别名
  • 命令执行时的顺序 ( 越上越优 )
    • 用绝对路径或相对路径执行的命令
    • 执行别名
    • 执行 Bash 的内部命令
    • 执行按照 $PATH 环境变量定义的目录查看找顺序找到的第一个命令
  • 让别名永久生效
vi /root/.bashrc
{
	alias vi='vim'	:	添加所想要生效的命令别名
}
  • 删除别名
    unalias 别名
  • Bash 常用快捷键
快捷键作用
ctrl + A把光标移动到命令行开头
ctrl + E移到结尾
ctrl + C强制终止当前的命令
ctrl + D退出当前终端
ctrl + L清屏, 相当于clear命令
ctrl + U删除或剪切光标之前的命令
ctrl + Y粘贴

输入输出重定向

  • 标准输入输出设备
    • 键盘 : 标准输入
    • 显示器 : 标准输出
  • 输出重定向
    将命令的输出结果输出到指定文件中
    命令 > 文件 : 覆盖
    命令 >> 文件 : 追加
  • 输入重定向
    不常用, 了解就好

多命令顺序执行与管道符

  • 多命令顺序执行
    ; : 命令和命令之间无关
dd命令 : date	;	if=/dev/zero of=/root/testfile bs=1k count=100000	;	date
{
	两个date与dd命令无关
	if=输入文件	:	指定源文件
	of=输出文件	:	指定目标文件
	bs=字节数	:	一次输出输入多少字节
	count=个数	:	指定输出输入多少个数据块
		即 bs * count =文件大小
}
  • && : 逻辑与 ( 当第一条命令执行成功后下一条命令才能执行 )
ls && ehco yes
  • || : 逻辑或 ( 当第一条命令执行失败后下一条命令才能执行 )
lst || echo no
  • ls && echo yes || echo no : 判断命令是否可以正确执行
  • | : 管道符 ( 第一条命令的正确输出作为第二条命令的操作对象 )
ll -a /etc | more

netstat -an | grep "ESTABLISHED"
grep命令 [参数] 搜索内容 文件名
{
	grep -in curry /root/stephen
	参数:
		{
			-i	:	不区分大小写
			-n	:	显示行号
			-v	:	反向查找
			--color=auto	:	搜索出的关键字用颜色显示
		}
}

通配符与其他特殊符号

  • 通配符 ( 匹配文件名 )
通配符作用
?匹配一个任意字符
*匹配0个或多个字符
[]匹配中括号中任意一个字符, 如[abc]:匹配a或b或c中的一个
[-]-代表一个范围, 如[a-z]:匹配一个字母
[^]逻辑非, 匹配非中括号内的一个字符, 如[^0-9]:匹配一个非数字字符
  • 其他特殊符号
特殊符号作用
’ ’单引号, 单引号中的所有特殊符号都没有特殊含义
" "双引号, $:调用变量的值; `:引用命令; :转义符
``反引号 ( esc键下边的符号 ), 反引号括起来的都是系统命令, 在bash中会先执行它
$()和反引号作用一样
#在shell脚本中, #开头的行表示注释
$调用变量的值
\转义符

bash的变量

用户自定义变量

  • 变量 : 计算机内存的单元, 其中存放的值可以改变
  • 变量设置规则 :
    • 可以由字母, 数字和下划线组成, 不能以数字开头;
    • 变量的默认类型都是字符串型, 可以指定变量类型;
    • 变量用等号连接值, 等号左右两侧不能有空格, 如name=curry;
    • 赋的值如果有空格, 需要使用单引号或双引号包括, 如name='stephen curry';
    • 赋的值中, 可以使用转义符;
    • 赋的值是可以叠加的;
    • 环境变量名建议大写, 便于区分.
  • 变量的分类 :
    • 自定义变量
    • 环境变量 : 主要保存的是和系统操作环境相关的数据
    • 位置参数变量 : 主要用来向脚本中传递参数或数据的, 变量名不能自定义, 变量的作用是固定的
    • 预定义变量 : 已经定义好的变量, 变量名不能自定义, 变量作用是固定的 ( 位置参数变量是预定义变量特殊的一种 )
    • 从上往下定义变量的规则越严格.
  • 自定义变量 ( 本地变量 )
    • 变量定义 : name="curry"
    • 变量调用 : echo $name
    • 变量叠加 : aa=123 aa="$aa"456
    • 变量查看 ( 所有 ) : set
    • 变量删除 : unset name

环境变量

  • 环境变量 :
    本地变量只在当前的shell中生效, 而环境变量会在当前shell和这个shell的所有子shell中生效, 如果把环境变量写入相应的配置文件, 那么这个环境变量就会在所有的shell中生效.
  • 设置环境变量 :
    • 变量定义 : export name=curry
    • 变量查询 ( 环境变量 ) : env
    • 变量删除 : unset name
  • 系统常见的环境变量 :
    • PATH : 系统查找命令的路径

      echo $PATH :
      /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
      路径之间以:分隔

      • 命令是已在配置文件中将命令的执行路径写好了, 单敲命令即可
      • 而脚本是通过绝对路径或相对路径的方式来执行
      • 如果把PATH变量叠加, 脚本就可直接执行了
      • PATH="$PATH":/tmp, 脚本放在了/tmp目录下, 这样该目录下的脚本就可以直接执行了
    • PS1 : 定义系统提示符的变量
      echo $PS1 :
      [\u@\h \W]\$

      • [root@localhost tmp]# 对应
      • \u : 显示用户名
      • \h : 显示主机名
      • \W : 显示当前所在目录的最后一个目录
      • \$ : 提示符, 如果root用户会显示为#, 如果是普通用户会显示为$

位置参数变量

  • $n : n为数字, $0表示命令本身, $1-9表示第一到第九个参数, 十以上的参数需用大括号包含, 如${10}
  • $* : 代表命令行中所有的参数, 把参数看成一个整体
  • $@ : 代表命令行中所有的参数, 把每个参数区别对待
  • $# : 代表命令行中所有参数的个数
[root@localhost tmp]# cat canshu1.sh 
#!/bin/bash

echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}
echo ${11}
[root@localhost tmp]# ./canshu1.sh 1 2 3 4 5 6 7 8 9 11 18
./canshu1.sh		# $0输出的结果
1
2
3
4
5
6
7
8
9
11		# ${10}的输出结果
18		# ${11}的输出结果
[root@localhost tmp]# cat canshu2.sh 
#!/bin/bash

sum=$(( $1 + $2 ))
echo "sum=$sum"
[root@localhost tmp]# ./canshu2.sh 10 20
sum=30		# $1+$2的输出结果
[root@localhost tmp]# cat canshu3.sh 
#!/bin/bash

echo $#
echo $*
echo $@
[root@localhost tmp]# ./canshu3.sh 1 2 3 4
4			# $#的输出结果
1 2 3 4		# $*的输出结果
1 2 3 4		# $@的输出结果
[root@localhost tmp]# cat canshu4.sh 
#!/bin/bash

for i in "$*"
	do
		echo $i
	done			#这个循环循环了一次, 因为$*将参数看成了一个整体

for j in "$@"
	do
		echo $j
	done			#这个循环循环了四次, 因为$@将参数看成了四部分
[root@localhost tmp]# ./canshu4.sh 1 2 3 4
1 2 3 4		#这是变量i的输出结果
1
2
3
4			#这是变量j的输出结果

预定义变量

  • $? : 返回0则证明上一条命令正确执行, 为非0则证明上一条命令没有正确执行
  • $$ : 显示当前进程号( pid )
  • $! : 后台运行的最后一个进程的进程号( pid )
[root@localhost tmp]# cat canshu5.sh 
{
	#!/bin/bash

	echo $$
	find /tmp -name curry &		注 : 符号&的意思是把命令放在后台执行
	echo $!
}

[root@localhost tmp]# ./canshu5.sh 
3293		$$的输出结果
3294		$!的输出结果
  • 接受键盘输入
    read [参数] [变量名]
    参数:
    • -p "提示信息" : 在等待read输入时, 输出提示信息
    • -t 秒数 : 指定等待用户输入的时间
    • -n 字符数 : 只接受指定字符数就会执行
    • -s : 隐藏输入的数据
[root@localhost tmp]# cat canshu6.sh 
{
	#!/bin/bash

	read -t 30 -p "please input your name: "  name
	echo $name
	
	read -t 30 -s -p "please input your age: "  age
	echo -e "\n"		注 : \n换行
	echo $age
	
	read -t 30 -n 1 -p "your gender is [m/f]" gender
	echo -e "\n"		注 : \n换行
	echo $gender
}
[root@localhost tmp]# ./canshu6.sh 
please input your name: curry
curry
please input your age: 

34
your gender is [m/f]m

m

bash的运算符

数值运算与运算符

  • declare [参数] 变量名 : 声明变量类型
    参数:
    • -i : 将变量声明为整数型
    • -x : 将变量声明为环境变量 ( integer )
    • -p : 显示指定变量的被声明的类型
[root@localhost tmp]# aa=11
[root@localhost tmp]# bb=22
[root@localhost tmp]# declare -i cc=$aa+$bb
[root@localhost tmp]# echo $cc
33
  • 变量名=$(( $变量a+$变量b )) : 常用的数值运算方法
[root@localhost tmp]# dd=$(( $aa+$bb ))
[root@localhost tmp]# echo $dd
33
  • 运算符
优先级运算符说明
1*, /, %乘除取模
2+, -加减
3==, !=等于 不等于
4&&逻辑与, 有0则0, 否则为1
5两竖杠逻辑或, 全0则0, 否则为1
6=, +=, -=赋值

优先级 : 越小越优

环境变量配置文件

环境变量配置文件简介

  • source 配置文件 : 使配置文件生效

环境变量的配置文件修改之后需要用户重新登录才能生效, 这里使用source命令可以直接使其生效.

source可以写成.

  • 环境变量配置文件主要是定义系统默认的环境变量

环境变量配置文件作用

  1. /etc/prifile
  2. /etc/profile.d/*.sh
  3. /etc/bashrc
  4. ~/.bash_profile
  5. ~/.bashrc

前三个配置文件在/etc目录下, 对任何用户都生效.

后两个配置文件在用户的家目录中, 只对属于该家目录的用户生效.

用户登录不输入用户名密码 : 环境变量配置文件的执行顺序为 1 -> 4 -> 5 -> 3 -> 登录成功

用户登录输入用户名密码 : 环境变量配置文件的执行顺序为 1 -> 2 -> 登录成功

  • 配置文件1的作用 :
    • 定义
      • USER变量
      • LOGNAME变量
      • MAIL变量
      • PATH变量
      • HOSTNAME变量
      • HISTSIZE变量
      • umask的值
    • 调用配置文件2
  • 配置文件2的作用 :
    • 调用配置文件
      • /etc/profile.d/lang.sh
        • 调用/etc/locale.conf
      • /etc/locale.conf
        • 定义系统语言为utf-8
  • 配置文件4的作用 :
    • 定义PATH变量
    • 调用配置文件5
  • 配置文件5的作用 :
    • 定义用户别名
    • 调用配置文件3
  • 配置文件3的作用 :
    • 定义系统提示符
    • 定义PATH变量
    • 定义umask的值
    • 调用配置文件2

其他配置文件和登录信息

  • 注销时生效的环境变量配置文件
    ~/.bash_logout : 默认情况下是空文件, 可以手动添加想要执行的命令
  • 历史命令保存的配置文件
    ~/.bash_history : 注销前的历史命令保存文件
  • shell登录信息
    /etc/moty : 本地登录和远程登录信息
[root@localhost ~]# cat /etc/motd 
警告:没有权限的用户请退出!										#编辑的登录信息
[root@localhost ~]# systemctl restart sshd.service 				#重启ssh服务
[root@localhost ~]# logout										#退出重新登录
Last login: Sat Apr 22 15:36:25 2023 from 192.168.200.1
警告:没有权限的用户请退出!										#显示的登录信息
[root@localhost ~]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值