首页 > 系统相关 >Shell脚本

Shell脚本

时间:2024-03-13 17:25:31浏览次数:21  
标签:脚本 10 Shell user xr home txt root

Shell脚本

1、文件头

固定格式,指向系统执行的部位

#!/bin/bash

...

2、变量

2.1、系统变量

$HOME=/root

$USER=当前用户

$PWD=当前路径

$SHELL=/bin/bash

2.2、自定义变量

2.2.1、变量的定义

(1)可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

(2)等号两侧不能有空格

(3)变量的值有空格,则用双引号或者单引号括起来

(4)export 变量名,可以把变量提升为系统变量

2.2.2、可变变量

(1)变量名=变量值

A=123

(2)赋值不能有空格,可以用unset删除变量

unset A

2.2.3、静态变量

(1)readonly 变量名=变量值

readonly B=123

(2)无法删除,不能使用unset进行删除

2.3、特殊变量

2.3.1、$n 执行文件 后缀变量

例如./xr.sh 1 2

echo "$0 $1 $2"

显示:./xr.sh 1 2

2.3.2、$# 参数个数

例如./xr.sh 1 2

echo $#

显示:2

2.3.3、$*、$@ 所有变量

(1)$*(把所有变量看成一个整体)

(2)$@ (把每一个变量区分对待)

例如 ./xr.sh 1 2

echo $*

echo $@

显示:./xr.sh 1 2

./xr.sh 1 2

2.3.4、$? 显示上一步命令执行结果

asdf qwerq(会报错,命令asdf找不到)

然后执行$?显示127(127代表命令找不到)

$? = 0 表示执行成功或者判断为true

$? = 1 表示判断为false

3、运算符

(1)expr运算,后面的运算符号之间必须要有空格

expr + - \* /
expr `expr 2 + 3` \* 5

(2)$((运算式))

$((2+3)*5)

(3)$[运算式]

$[(2+3)*5]

4、条件判断

[ condition ] 前后必须加空格,不为空则为ture

4.1、判断大小

-lt (less than) 小于

-le (less equal) 小于等于

-gt (greater than) 大于

-ge (greater equal) 大于等于

= (字符串比较) 等于

-ne (not equal) 不等于

4.2、判断文件权限

-r (read) 读权限判断

-w (write) 写权限判断

-x (execute) 执行权限判断

4.3、判断文件类型

-f (file) 是否为常规文件

-e (existence) 是否存在文件

-d (directory) 是否为目录文件

4.4、多条件判断

(1)&&表示前一条执行成功时,才执行后一条命令

(2)||表示上一条命令执行失败了,才执行后一条命令

[ condition ] && echo OK || echo notok
OK
[ condition ] && [  ] || echo notok
notok

5、写入数据到一个文件中

#!/bin/bash

# 创建一个文件
touch /home/xr/zhangsan.txt
# 将指定数据写入文件使用 echo "..." >> ...文件
echo "I am ZhnagSan , I'm 18 year old,a smart boy,thank you!" >> /home/xr/zhangsan.txt

6、流程控制(重点)

6.1、if 判断

if[ 条件判断式 ];then

​	执行

elif[ 条件判断式 ];then

​	执行

if

6.2、case 语句

case $1 in

"a")

​	执行

​	;;

"b")

​	执行

​	;;

*)

​	default执行

​	;;

esac

6.3、for 循环

for((i=0;i<$1;i++))

do

​	执行

done

6.4、while 循环

while [ 条件判断式 ]

do

​	执行

done

7、read读取控制台输入

# 七秒内输入值记录到NAME参数中
read -t 7 -p "Enter your name in 7 seconds :" NAME

echo $NAME

8、函数

8.1、系统函数

(1)basename文件名

basename /home/xr/zhangsan.txt得到zhangsan.txt

basename /home/xr/zhangsan.txt .txt得到zhangsan

(2)dirname文件绝对路径

dirname /home/xr/zhangsan.txt得到/home/xr

8.2、自定义函数

### 自定义函数

[ function ] funname[()]

{

​	Action;

​	[return int;]

}

funame

# 输入两个参数求和
function sum()
{
        sum=0;
        sum=$[$1+$2]
        echo $sum
}

read -p "input your paratemer1:" P1
read -p "input your paratemer2:" P2

sum $P1 $P2

9、Shell工具(重点)

9.1、cut

数据剪切,-d 使用间隔什么剪切,-f 剪切后取第几列

cut -d "剪切符号" -f 选择剪切完的第几个 跟文件地址

# 取第一个
 cut -d " " -f 1 ./cut.log

# 取第二个第三个
cut -d " " -f 2,3 ./cut.log

# 取第三个及以后的数据
cut -d " " -f 3- ./cut.log

# 配合过滤使用
cat cut.log | grep wang | cut -d " " -f 1
wang

# 取系统环境路径的第二个:之后的所有路径
 echo $PATH | cut -d : -f 3-
 /usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin
 
# 取ip地址
 ifconfig eth1 | grep "inet " | cut -d " " -f 10
 192.168.56.10

9.2、sed

对文本数据输出缓冲流进行处理

sed -e 多命令处理 ""

# a 新增(create)
[root@10 xr]# sed "2a abc" sed.txt
zhang san
li si
abc
wang wu
zhao liu
wa wa
wo  wo
# d 删除(delete)
[root@10 xr]# sed "2d" sed.txt
zhang san
wang wu
zhao liu
wa wa
wo  wo
[root@10 xr]# sed "/wo/d" sed.txt
zhang san
li si
wang wu
zhao liu
wa wa
# s 替换(transfrom) + g 全局替换(global)
[root@10 xr]# sed "s/wo/ni/" sed.txt
zhang san
li si
wang wu
zhao liu
wa wa
ni  wo
[root@10 xr]# sed "s/wo/ni/g" sed.txt
zhang san
li si
wang wu
zhao liu
wa wa
ni  ni
# -e 多命令执行
[root@10 xr]# sed -e "s/wo/ni/g" -e "2d" -e "3a abc" sed.txt
zhang san
wang wu
abc
zhao liu
wa wa
ni  ni

9.3、awk

文本分析工具

awk -F "指定输入文件折分隔符" -v "赋值一个用户定义变量" ‘操作’ "指定文件"

# awk '/正则表达式/ {print 打印内容 FILENAME文件名 NR行号 NF列号}'
# 打印passwd文件中的root开头的第七列数据
[root@10 xr]# awk -F : '/^root/ {print $7}' passwd
/bin/bash
# 打印root开头,第一列和第七列的数据,以逗号分隔
[root@10 xr]# awk -F : '/^root/ {print $1","$7}' passwd
root,/bin/bash
# 打印文件中的数据,行头加数据,行尾加数据 中间的以user:开头,输出第一列第七列数据,并以逗号分隔
[root@10 xr]# awk -F : 'BEGIN{print "ImStart,shell"} {print "user:"$1","$7} END{print "ImEND,/bin/bash"}' passwd
ImStart,shell
user:root,/bin/bash
user:bin,/sbin/nologin
user:daemon,/sbin/nologin
user:adm,/sbin/nologin
user:lp,/sbin/nologin
user:sync,/bin/sync
user:shutdown,/sbin/shutdown
user:halt,/sbin/halt
user:mail,/sbin/nologin
user:operator,/sbin/nologin
user:games,/sbin/nologin
user:ftp,/sbin/nologin
user:nobody,/sbin/nologin
user:systemd-network,/sbin/nologin
user:dbus,/sbin/nologin
user:polkitd,/sbin/nologin
user:rpc,/sbin/nologin
user:tss,/sbin/nologin
user:rpcuser,/sbin/nologin
user:nfsnobody,/sbin/nologin
user:sshd,/sbin/nologin
user:postfix,/sbin/nologin
user:chrony,/sbin/nologin
user:vagrant,/bin/bash
ImEND,/bin/bash
# 输出第三列的行号并加一
[root@10 xr]# awk -F : -v i=1 '{print $3+i}' passwd
1
2
3
4
5
6
7
8
9
12
13
15
100
193
# FILENAMWE 文件名  NR 行号  NF 列号
[root@10 xr]# awk -F : '{print FILENAME NR NF}' passwd
passwd17
passwd27
passwd37
passwd47
passwd57
passwd67
passwd77
passwd87
passwd97
passwd107
passwd117
passwd127
passwd137
passwd147
passwd157
passwd167
passwd177
passwd187
passwd197
passwd207
passwd217
passwd227
passwd237
passwd247
# 切取ip地址
[root@10 xr]# ifconfig eth1 | grep "inet " | awk -F " " '{print $2}'
192.168.56.10
# 空行行号打印
[root@10 xr]# awk '/^$/ {print NR}' sed.txt
7
[root@10 xr]# cat sed.txt
zhang san
li si
wang wu
zhao liu
wa wa
wo  wo

la  la  la la

9.4、sort

文件排序,结果输出

sort -n(数值大小排序) -r(以相反的顺序排序) -t(设置排序所用的分割字符) -k(指定需要排序的列)

# sort -t "指定排序分隔符" -n(数值大小排序)r(以相反顺序排序)k(指定排序的列) num(指定列数)
[root@10 xr]# cat sort.sh
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
# 第二行升序排序
[root@10 xr]# sort -t : -nk 2 sort.sh
cls:10:3.5
bd:20:4.2
ss:30:1.6
bb:40:5.4
xz:50:2.3
# 第二行降序排序
[root@10 xr]# sort -t : -nrk 2 sort.sh
xz:50:2.3
bb:40:5.4
ss:30:1.6
bd:20:4.2
cls:10:3.5
# 第三行升序排序
[root@10 xr]# sort -t : -nk 3 sort.sh
ss:30:1.6
xz:50:2.3
cls:10:3.5
bd:20:4.2
bb:40:5.4
# 第三行降序排序
[root@10 xr]# sort -t : -nrk 3 sort.sh
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6

10、练习

10.1、京东

问题1:使用Linux命令查询file1中空行所在的行号

[root@10 xr]# awk '/^$/ {print NR}' file.txt
7

问题2:有文件testq2.txt内容如下:

​ 张三 40

​ 李四 50

​ 王五 60

使用Linux命令计算第二列的和并输出

[root@10 xr]# cat testq2.txt | awk -F " " '{sum+=$2} END{print sum}'
150

10.2、搜狐&讯网

问题1:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?

[root@10 xr]# ./testfile.sh /home/xr
目录存在
[root@10 xr]# ./testfile.sh /home/xr/xr.sh
文件存在
[root@10 xr]# ./testfile.sh /home/xr/xr6.sh
既不是文件也不是目录
[root@10 xr]# ./testfile.sh /home/xr/xr6
既不是文件也不是目录
[root@10 xr]# cat testfile.sh
#!/bin/bash

if [ -f $1 ];then
        echo "文件存在"
elif [ -d $1 ];then
        echo "目录存在"
else
        echo "既不是文件也不是目录"
fi

10.3、新浪

问题1:用shell写一个脚本,对文本中无序的一列数字排序

[root@10 xr]# cat testnumber.txt
9
8
7
6
5
4
3
2
10
1
# 降序
[root@10 xr]# sort -nrk 1 testnumber.txt
10
9
8
7
6
5
4
3
2
1
# 升序
[root@10 xr]# sort -nk 1 testnumber.txt
1
2
3
4
5
6
7
8
9
10
# 升序 求和
[root@10 xr]# sort -n testnumber.txt | awk '{a+=$0;print$0} END{print "sum="a}'
1
2
3
4
5
6
7
8
9
10
sum=55
# 降序 求和
[root@10 xr]# sort -nr testnumber.txt | awk '{a+=$0;print$0} END{print "sum="a}'
10
9
8
7
6
5
4
3
2
1
sum=55

10.4、金和网络

问题1:请用shell脚本写处查找当前文件夹(/home/xr)下所有的文本文件内容中包含有字符“wo”的文件名称

# grep 
# -i(忽略大小写进行匹配) 
# -v(反向查找,只打印不匹配的行) 
# -r(递归查找子目录中的文件) 
# -l(只打印匹配的文件名) 
# -c(只打印匹配的行数)
[root@10 xr]# grep -r "wo" /home/xr | cut -d ":" -f 1
/home/xr/xr.sh
/home/xr/leap.log
/home/xr/leap.log
/home/xr/leap.log
/home/xr/leap.log
/home/xr/sed.txt
/home/xr/passwd
[root@10 xr]# grep -r "wo" -l /home/xr
/home/xr/xr.sh
/home/xr/leap.log
/home/xr/sed.txt
/home/xr/passwd

标签:脚本,10,Shell,user,xr,home,txt,root
From: https://www.cnblogs.com/xiaro115/p/18071086

相关文章

  • pnpm : 无法加载文件 D:\dev\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。有关详
    一、问题现象  二、问题原因  1、此问题是由于PowerShell的执行策略限制了脚本的执行//通过命令可以查看当前策略Get-ExecutionPolicy     2、策略说明:Restricted:默认策略,禁止运行任何脚本,除非明确允许。AllSigned:只允许运行经由数字签名并由受信......
  • 一些常见的shell问题和答案
    什么是Shell脚本?它有什么作用?Shell脚本是一种用Shell语言编写的脚本文件,用于自动化执行一系列命令和操作。它可以用于系统管理、任务自动化、数据处理等各种用途。如何在Shell脚本中定义变量?如何使用变量?在Shell脚本中,可以使用变量名=值的形式来定义变量,例如name="John"......
  • PowerShell 命令来获取已启用的功能列表
     PowerShell命令来获取已启用的功能列表:powershellCopyCodeGet-WindowsOptionalFeature-Online|Where-Object{$_.State-eq"Enabled"}请在PowerShell窗口中运行该命令,它应该能够列出已启用的Windows功能 命令来获取Windows功能的详细信息,包括其状态:shel......
  • linux Shell 命令行-07-func 函数
    拓展阅读linuxShell命令行-00-intro入门介绍linuxShell命令行-02-var变量linuxShell命令行-03-array数组linuxShell命令行-04-operator操作符linuxShell命令行-05-test验证是否符合条件linuxShell命令行-06-flowcontrol流程控制linuxShell命令行-07-f......
  • linux 程序状态查询脚本
    linux程序状态查询脚本#!/bin/bashsource/etc/profileDOCKERCOMPOSE=/usr/local/bin/docker-composeSHELL_FOLDER=$(cd"$(dirname"$0")";pwd)action=${1-}#workdir=$PWD#cd$workdir#docker-composepsfunctionGetApollo(){echo""......
  • 错误:在 /tmp/easy_install-rad8_t5b/PyQt5-5.14.0.tar.gz #15 中找不到安装脚本
    thePyQt55.14.0isbrokenbecausecan'tnotinstallonresppi3.youcantoinstallaversionofPyQt5thatworkingfineonresp.followthesteps:PyQt55.14.0已损坏,因为无法无法安装在resppi3上。您可以安装一个在resp上运行良好的PyQt5版本,请按照以下......
  • python安装库文件的时候一个一个安装的py脚本
    在编译安装一些python软件的时候,经常使用pipinstall-rrequirements.txt命令执行。如果其中一个库编译失败,会导致所有的库安装失败,非常费事费力。于是写了一个py小脚本pipinstall.py,将库改为一个一个的安装,这样再碰到编译失败的,也不会影响其它的库,节省时间。文件pipinsta......
  • Windows命令行不加解释器和文件后缀名直接运行Python脚本
    Windows命令行不加解释器和文件后缀名直接运行Python脚本首次编辑:24/2/29/20:30最后编辑:24/2/25/20:44引子都知道Windowscmd中,运行可执行文件和bat时,可以直接输入不带后缀的文件名。rem运行main.exemainrem运行mybat.batmybat而执行python脚本时,却需要指明python作......
  • PowerShell 定时备份MySQL数据
    #========================================================#Function:备份MySQL数据库#ReleaseVersion:v0.0.3#ReleaseDate:2020年8月17日#Author:panda666#Website:www.panda666.com#=====================================......
  • Linux与Shell 第0天
    传送门前言感觉其实对于程序员来说,Linux会基本命令和Shell就可以了,更细节的那是运维岗位的人该做的事情3天搞定Linux,1天搞定Shell,清华学神带你通关目录Liunx概述Linux安装文件目录与结构VIM编辑器网络配置系统管理远程登录实操文件目录日期时间用户管理文件权限......