Shell脚本(一)_基础语法

13 篇文章 0 订阅

AUTHOR:闫小雨

TIME:2024-05-08


目录

一、shell基础

1、为什么用 Shell 脚本

2、用户的登录 Shell

1、编写第一个shell脚本

二、重定向与管道操作

1、重定向操作

1)重定向输入

2)重定向输出

3)错误重定向输出

4)混合输出

2、管道符操作

三、使用 Shell 变量

1、自定义变量

2.变量赋值的特殊操作

1)双引号的使用场合

2)单引号的使用场合

3)反撇号的使用

4)read 命令

5)变量的使用范围

四、特殊的 Shell 变量

1.环境变量

2.位置变量

3.预定义变量


一、shell基础


1、为什么用 Shell 脚本

用来解决服务器自动化运维,减轻管理员的工作量,解决大量的重复性的输入和交互式操作问题。

2、用户的登录 Shell

  • Shell:一个特殊的应用程序,位于用户和操作系统内核之间,用来把用户输入的命令解释给系统内核去执行,并输出执行结果 (解释器)
  • 查看 Linux 系统所支持的 Shell 脚本种类:cat /etc/shells
[root@yanxy502 ~]# cat /etc/shells
/bin/sh
/bin/bash                 # /bin/bash 是大多数 Linux 用户系统的默认 Shell
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

1、编写第一个shell脚本

1)基本格式

[root@yanxy502 ~]# vim shell.sh             	# 前面的 shell 可以随意. 后缀必须为  .sh
#!/bin/bash                   								# 脚本声明
#这是一个简单的Shell脚本         								# 注释
cd /mnt                     									# 脚本要执行的命令
echo "当前目录位于:"
pwd

2)执行脚本

./方式必须加可执行权限。

[root@yanxy502 ~]# chmod 755 shell.sh
[root@yanxy502 ~]# ./shell.sh

sh 方式不需要加执行权限。

[root@yanxy502 ~]# sh shell.sh

二、重定向与管道操作


1、重定向操作

1)重定向输入

<:从指定的文件读取数据,而不是从键盘输入。

[root@yanxy502~]# vim passwd.txt
ABC123$
[root@yaxny502 ~]# useradd yanxiaoyu
[root@yanxy502 ~]# passwd --stdin yanxiaoyu < passwd.txt 
更改用户 yanxiaoyu 的密码 。
passwd:所有的身份验证令牌已经成功更新。

2)重定向输出

>:将输出结果保存到指定的文件(覆盖原文件)。

[root@yanxy502 ~]# uname -p > a.txt
[root@yanxy502 ~]# cat a.txt 
x86_64

>>:将输出结果追加到指定的文件。

[root@yanxy502 ~]# uname -r >> a.txt 
[root@yanxy502 ~]# cat a.txt 
x86_64
3.10.0-1062.el7.x86_64 				#这是追加进来的

3)错误重定向输出

2>:将错误信息保存到指定的文件(覆盖原文件)。

[root@yanxy502 ~]# tar jcf /nonedir/etc.tgz /etc/ 2> error.log
[root@yanxy502 ~]# cat error.log 
tar: 从成员名中删除开头的“/”
tar (child): /nonedir/etc.tgz:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now

2>>:将错误信息追加到指定的文件中。

[root@yanxy502 Test]# cdd 2>> error.log 
[root@yanxy502 Test]# cat error.log 
tar: 从成员名中删除开头的“/”
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
bash: cdd: 未找到命令

4)混合输出

&>:表示直接把正确的输出和错误的输出都直接保存到后面的文件中,后面文件的原始数据丢失。

[root@yanxy502 ~]# pwd &> a.sh
[root@yanxy502 ~]# cat a.sh 
/home/Test

&>>:表示直接把正确的输出和错误的输出都直接追加到后面的文件中,原始文件数据保留。

[root@yanxy502 ~]# pwdd &>> a.sh 
[root@yanxy502 ~]# cat a.sh 
/root
bash: pwdd: 未找到命令...

2、管道符操作

|管道符:将管道符号 | 左侧命令的操作结果,作为右侧命令的执行对象。(同一行命令中可以使用多个)

[root@yanxy502 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
yanxiaoyu:x:1000:1000::/home/yanxiaoyu:/bin/bash
[root@yanxy502 ~]# grep "/bin/bash$" /etc/passwd | wc -l
2

三、使用 Shell 变量


Shell 变量是用来存放系统和用户需要使用的特定参数,这些特定参数会根据用户的设定或环境的变化而变化,Shell 变量的使用能够提供更强的适应性与功能。

1、自定义变量

  • 由系统用户自己去定义,只在用户自己的 Shell 环境中有效,又称为本地变量。
  • 基本格式:变量名=变量值(其中=是赋值符号,=两边不能有空格,变量名需要以字母或者下划线开头,不能包含特殊字符)
[root@yanxy502 ~]# name=yanxy     	  #定义变量name,并赋值为yanxy
[root@yanxy502 ~]# age=21           	#定义变量age,并赋值为21
[root@yanxy502 ~]# echo $name        	#查看变量name
zhangsan
[root@yanxy502 ~]# echo $value       	#查看变量value,因为没有定义value,所以结果为空

[root@yanxy502 ~]# echo $name age     #每一个不同变量,都需要再前面加上一个"$"符号
yanxy	age
[root@yanxy502 ~]# echo $name $age   	#查看变量name与变量age
yanxy 21

2.变量赋值的特殊操作

1)双引号的使用场合
  • a:当赋值内容中包含空格时必须使用双引号。
[root@localhost ~]# PYTHON=Java 18.9.9.9 			#错误赋值
bash: 2.7.14: 未找到命令...
[root@localhost ~]# PYTHON="Java 18.9.9.9"  	#正确赋值
[root@localhost ~]# echo $PYTHON
Java 18.9.9.9

  • b:当赋值内容中用 $ 引用了其它变量时,必须要使用双引号。
[root@yanxy502 ~]# aaa="ni hao"     					#赋值 aaa 值
[root@yanxy502 ~]# echo $aaa
ni hao
[root@yanxy502 ~]# bbb="$aaa ma"    					#将 aaa 值赋予给 bbb
[root@yanxy502 ~]# echo $bbb
ni hao ma

2)单引号的使用场合
  • 当赋值内容中包含 $ 、双引号、\ 等含有特殊的字符时,需要使用单引号扩起来。
[root@yanxy502 ~]# aaa='ni hao $b'  	  			#单引号不会引用其他变量
[root@yanxy502 ~]# echo $aaa
ni hao $b

3)反撇号的使用
  • 用于命令的替换或者是命令的赋值;把某个命令的执行结果赋值给变量。
[root@yanxy502 ~]# shijian=`date`     	 			#把 date 这个命令的执行结果赋值给 shijian
[root@yanxy502 ~]# echo $shijian     	 				#查询
2024年 05月 08日 星期五 17:29:28 CST     	    #返回的时间

4)read 命令
  • 用来提示用户从键盘读入数据,赋值给变量。从而实现简单的交互过程。(类似于Java中Scaneer)
[root@yanxy502 ~]# read aaa   									#普通赋值
ni hao wo shi yanxiaoyu
[root@yanxy502 ~]# echo $aaa
ni hao wo shi yanxiaoyu		
[root@yanxy502 ~]# read -p "你是谁" bbb    			#设置提示信息,以便告知用户输入说明内容 (使交互操作更加友好,提高易用性)
你是谁 我是闫小雨
[root@yanxy502 ~]# echo $bbb
我是闫小雨

5)变量的使用范围
  • 局部变量:只在当前 Shell 环境中有效。
  • 全局变量:在所有 Shell 环境中有效。==>export
[root@localhost ~]# boss=aaa    					#定义局部变量
[root@localhost ~]# export boss  					#把局部变量转化为全局变量
[root@localhost ~]# echo $boss   
aaa
[root@localhost ~]# bash    							#进入子Shell
[root@localhost ~]# echo $boss    				#再次进行查看,可以正常显示
aaa
[root@localhost ~]# export aaa=yanxiaoyu  #直接将变量设置全局变量
[root@localhost ~]# echo $aaa
yanxiaoyu

6)变量的运算:expr

加法运算

+

减法运算

-

乘法运算

\*

除法运算

/

求模运算(取余运算)

%

[root@yanxy502 ~]# X=100
[root@yanxy502 ~]# echo $X
100
[root@yanxy502 ~]# Y=20
[root@yanxy502 ~]# echo $Y
20
[root@yanxy502 ~]# expr $X - $Y 	   	 			#减法运算: -
80
[root@yanxy502 ~]# expr $X \* $Y 		 			#乘法运算: \*
2000
[root@yanxy502 ~]# expr $X / $Y 	 	 				#除法运算: /
5
[root@yanxy502 ~]# expr $X % $Y   		 			#求模(取余)运算: %
0

四、特殊的 Shell 变量


1.环境变量

  • 由系统提前创建,用来设置用户的工作环境。

配置文件: /etc/profile ~/.bash_profile

[root@yanxy502 ~]# env  							#查看当前环境变量

常见的环境变量:

  • USER:表示用户名称。
  • HOME:表示用户的宿主目录。
  • LANG:表示语言的字符集。
  • PWD:表示当前所在工作目录。
  • PATH:表示命令搜索路径。
[root@yanxy502 ~]# echo  $HOSTNAME  = hostname 	#查看主机名
[root@yanxy502 ~]# echo $PWD = pwd   						#查看当前的工作目录
[root@yanxy502 ~]# echo $LANG     							#查看语言个字符集
[root@yanxy502 ~]# echo $PATH  									#查看默认的搜索路径

改变环境变量:

  • 临时更改: 给搜索路径中添加 /root 执行 PATH="$PATH:/root" 会立即生效,重启后失效。
[root@yanxy502 ~]# ll aaa.sh  				 						#查看脚本文件的位置
-rwxr-xr-x 1 root root 30 5月   8 18:54 aaa.sh
[root@yanxy502 ~]# chmod +x aaa.sh  		 					#赋予aaa.sh可执行权限
[root@yanxy502 ~]# PATH="$PATH:/root" 		 				#立即生效,重启后消失
[root@yanxy502 ~]# aaa.sh        			 						#可以直接以文件名运行脚本
当前目录位于
/root

  • 永久更改: 给搜索路径中永久添加 root: 执行。
[root@yanxy502 ~]# echo PATH="$PATH:/root" >> /etc/profile     #把搜索路径添加到环境变量的主配置文件
[root@yanxy502 ~]# .	/etc/profile                           	 #立即执行脚本,让环境变量立即生效

2.位置变量

使用 Shell 脚本程序时,方便通过目录行为程序提供操作参数(也叫位置参数;使用$1、$2、… $9 表示;$1 表示脚本或命令后的第一个位置,然后依次类推)

[root@yanxy502 ~]# vim qh.sh
#!/bin/bash
SUM=`expr $1 + $2`  		  	 					#定义变量SUM,SUM的值是位置变量 1 和位置变量 2 的和
echo "$1 + $2 = $SUM" 			 					#返回值的含义就是  $1 + $2 = $1 + $2 
[root@yanxy502 ~]# chmod +x qh.sh  		#赋予脚本可执行权限
[root@yanxy502 ~]# ./qh.sh 100 11  		#100就是$1;11就是$2
100 + 11 = 111   											#返回的结果

  • 注意:如果当位置变量超过 $9,即 $10,$11 … 时,则需要使用 { } 来括起来。如: ${11}

3.预定义变量

  • bash 程序预先定义好的一类特殊变量,用户只能使用,不能创建和修改预定义变量。

预定义变量:

$#

命令行中位置变量的个数。

$*

所有位置变量的内容。(在 for 循环中如果 $* 用 " " 括起来的情况下,则会把位置变量视为整体来输出。如:$1 $2 … $n 的形式输出所有参数)

$@

所有位置变量的内容。(在 for 循环中如果 $@ 用 " " 括起来的情况下,则会把位置视为个体来输出。如:$1、$2、… $n 的形式输出所有参数)

$0

当前执行的进程/程序名。

$$

Shell 脚本本身的 PID 号(ProcessID,即脚本运行的当前进程 ID 号)

$!

后台运行的最后一个进程的 PID 号。

$?

上一条命令执行后返回的状态,当返回状态值为 0 时表示执行正常,非 0 值表示执行异常或出错。

  • 33
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫叫闫小雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值