热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sedi单引号中嵌套双引号_面试中的shell部分看着就对了

“进入企业后,大部分情况都是Linux操作系统,那么熟悉命令的用法以外,熟悉使用shell脚本也是让我们有更多时间摸鱼的好办法(ps面试要
108d63847a5590f20552210352a3e18c.png
“ 进入企业后,大部分情况都是Linux操作系统,那么熟悉命令的用法以外,熟悉使用shell脚本也是让我们有更多时间摸鱼的好办法(ps面试要注意哦),开整!

1 shell是什么

“ 平时经常在Linux操作系统中使用各种命令,比如查看当前的目录文件,我们会使用"ls"或者"ls -l",这些字符串参数实际上会被"某段程序"执行并启动它。这个负责将用户输入的字符串转换为需要执行程序的东西叫做"shell"。即帮用户更方便使用操作系统接口的“壳”。同样的壳还有当我输入Maven+相关参数的时候是不是就会去执行相应的功能,我们驶入sql语句的时候,数据库引擎是不是也会各种调用,一样的道理

2 尝试编写第一个shell

“ vim创建打开一个文件,扩展名为.sh。如下所示

#!/bin/bash #告诉系统使用什么解析器
echo "Hello xiaolan !" # echo进行输出

  • 执行方法1
“ chmod +x ./hello.sh
./hello.sh
  • 执行方法2
“ /bin/sh hello.sh

3 变量

“ 变量名和等号之间不能有空格

定义变量注意事项

  • 命名首个字符不能是数字,只能使用英文字母、数字和下划线
  • 不能使用标点符号
  • 不能使用bash中关键字

变量使用

“ 使用变量(使用变量的过程中,最好加上花括号),只需要在变量前面加上美元符号即可

#!/bin/bash
James="小皇帝"
echo $James

只读变量

“ 使用readonly将变量定义为只读,只读意味着不能改变

#!/bin/bash
James="小皇帝"
readonly James
James="登哥"

删除变量

“ 使用unset删除变量 变量删除以后不能再次使用,且不能删除只读变量

#!/bin/bash
James="小皇帝"
unset James
echo $James #不会有任何输出

变量类型

  • 局部变量
“ 仅当前shell可用
  • 环境变量
“ 所有程序都能访问环境变量
  • shell变量
“ 通过一部分环境变量和shell变量保证shell的正常运行

4 字符串

“ 使用字符串的过程中,既可以用双引号也可以用单引号,也可以不用
  • 单引号
“ 单引号内容原样输出,不能包含变量,且不能出现单独单引号
  • 双引号
“ 可以出现转义字符

#!/bin/bash
James="小皇帝"
str=""$ James"! oh my gad n "
echo -e $str

获取字符串长度

“ 使用#

string="qwert"
echo $(#string)# 提取子字符串
echo $(string:1:3)
#查找字符串
echo

5 数组

“ 支持以为数组

定义数组

“ 数组元素使用“空格”隔开

array=(value1,value2,value3)

读取数组

value1=${array[0]}

使用@输出数组所有元素

echo ${array[@]}

获取数组中所有元素以及数组长度

#! /bin/bash
# author:xiaolan
array[0]=a
array[1]=b
array[3]=cecho “数组的元素为:${array[*]}”
echo “数组的元素为:${array[@]}”
echo “数组的个数为:${#array[*]}”
echo “数组的个数为:${#array[@]}”

执行

./array.sh

结果

287379e02aa41aeb0afe249f7fb66a70.png

6 注释

单行注释

“ 使用#开头的行为注释,会被解释器忽略

多行注释

:<

7 shell传递参数

“ 在执行shell的时候&#xff0c;命令行指定参数&#xff0c;如下所示

#!/bin/bash
James&#61;"小皇帝"
echo "执行的文件名为:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"

执行

./param.sh 1 2

结果

d09680f9c8cd0b00d6de7478ee56feb0.png

几个特殊字符

dc309a93945ee60860718d11907d5e23.png

案例(partionnal.sh)

#!/bin/bash
# author:xiaolanecho "-- $* 演示 ---"
for i in "$*"; doecho $i
doneecho "-- $&#64; 演示 ---"
for i in "$&#64;"; doecho $i
done

执行

./demo2.sh 1 2 3

结果

2125a5db606bfd1df863d8ada482032f.png
&#64;区别

相同点&#xff1a;都是会引用所有参数

不同点&#xff1a;在使用双引号的时候。如果脚本运行时两个参数为a,b&#xff0c;则"*"等价于"ab",而"&#64;"等价于"a","b"

#!/bin/bash
# author:xiaolanecho "-- $* 演示 ---"
for i in "$*"; doecho $i
doneecho "-- $&#64; 演示 ---"
for i in "$&#64;"; doecho $i
done

8 printf

“ 使用printf格式化字符串&#xff0c;同时可以指定字符串宽度和对齐方式&#xff0c;格式如下

printf format-string [arguments...]#!/bin/bash
# author:xiaolanprintf "%-8s %-8s %-4sn" 姓名 科目 分数
printf "%-8s %-8s %-4fn" 小明 数学 97
printf "%-8s %-8s %-4fn" 小话 语文 89
printf "%-8s %-8s %-4fn" 王三 英语 93

结果

5a420b4b3f55f8715d438f0ecd642e31.png

9 test

“ shell中的test用于检查某个条件是否成立
c5f7dbc0c5c76c65d52ca232bae9fcc0.png

案例

#!/bin/bash
# author:xiaolan
num1&#61;55
num2&#61;55
if test $[num1] -eq $[num2]
thenecho &#39;两个数相等&#xff01;&#39;
elseecho &#39;两个数不相等&#xff01;&#39;
fi

结果

5b39226955be8100d24a359fc2b129d9.png

字符串比较

f876a7df0fdb9476d6db7d743044ff53.png

#!/bin/bash
# author:xiaolan
num1&#61;"xiaolan"
num2&#61;"xiaolna"
if test $num1 &#61; $num2
thenecho &#39;两个字符串相等!&#39;
elseecho &#39;两个字符串不相等!&#39;
fi

结果

e1efdbe8299fe69cbed065d5a89e0947.png

10 流程

if语句语法格式

if condition
thenexec1 exec2...execN
fi

如果简化为一行

if [$(ps -ef | grep -c "httpd") -gt 1];then echo "true";fi

if else-if else

if condition1
thenexec1
elif condition2
then exec2
elseexecn
fi

案例 判断两数值是否相等

#!/bin/bash
# author:xiaolan
a&#61;2
b&#61;3
if [ $a &#61;&#61; $b ]
thenecho "a 等于 b"
elif [ $a -gt $b ]
thenecho "a 大于 b"
elif [ $a -lt $b ]
thenecho "a 小于 b"
elseecho "没有符合的条件"
fi

for循环

for loop in 1 2 3 4 5
doecho "The value is: $loop"
done

while语句

“ 通常用于从输入文件不断读取数据

while condition
doexec
done#!/bin/bash
# author:xiaolan
int&#61;1
while(( $int<&#61;6 ))
doecho $intlet "int&#43;&#43;"# 用于执行一个或者多个
done

无限循环

while true
doexec
done

case语句

“ 多选择语句。取值后面为单词in&#xff0c;每一个模式以")"结束。匹配发现取值符合某一模式后&#xff0c;其间所有命令开始执行直至 ";;"。

#!/bin/bash
# author:xiaolan
echo &#39;输入 1 到 3 之间的数字:&#39;
echo &#39;你输入的数字为:&#39;
read aNum
case $aNum in1) echo &#39;你选择了 1&#39;;;2) echo &#39;你选择了 2&#39;;;3) echo &#39;你选择了 3&#39;;;*) echo &#39;你没有输入 1 到 3 之间的数字&#39;;;
esac

输入不同的内容&#xff0c;会有不同的结果&#xff0c;例如&#xff1a;

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

跳出循环

break

“ break命令允许跳出所有循环

#!/bin/bash
# author:xiaolan
while :
doecho -n "输入 1 到 3 之间的数字:"read aNumcase $aNum in1|2|3) echo "你输入的数字为 $aNum!";;*) echo "你输入的数字不是 1 到 3 之间的! 游戏结束"break;;esac
done

continue

“ 跳出当次循环

#!/bin/bash
while :
doecho -n "输入 1 到 3 之间的数字: "read aNumcase $aNum in1|2|3|4|5) echo "你输入的数字为 $aNum!";;*) echo "你输入的数字不是 1 到 3 之间的!"continueecho "游戏结束";;esac
done

10 shell函数

“ 用户定义函数&#xff0c;然后在shell脚本中随便调用&#xff0c;格式如下

[ function ] funname [()]{action;[return int;]}

例子

#!/bin/bash
# author:xiaolanFun1(){echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
Fun1
echo "-----函数执行完毕-----"

带return语句

#!/bin/bash
# author:xiaolanFunReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumecho "两个数字分别为 $aNum 和 $anotherNum !"return $(($aNum&#43;$anotherNum))
}
FunReturn
echo "输入的两个数字之和为 $? !"

函数参数

#!/bin/bash
# author:xiaolanfunParam(){echo "第一个参数为 $1 !"echo "第二个参数为 $2 !"echo "参数总数有 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}
funParam 1 2 3 4

11 shell重定向

输出重定向

“ command1 > file # 如果file中存在内容将被清空覆盖。如果追加使用command1 >>file

ls -l > dir.txt

cat dir.txt

fda9ca12c23d389b06758cb92d59ee0a.png

/dev/null文件

“ 写入到它的内容都会被丢弃&#xff0c;会起到"禁止输出"的效果&#xff0c;如果希望屏蔽stdout和stderr
“ command > /dev/null 2>&1

注意&#xff1a;Linux命令行都会打开三个文件

  • 标准输入文件:stdin文件描述符为0
  • 标准输出文件:stdout文件描述符为1
  • 标准错误文件:stderr文件描述符2

12 运算符

下表列出了常用的算术运算符&#xff0c;假定变量 a 为 2&#xff0c;变量 b 为 3&#xff1a;

算术运算符

ef261118b9351a99bd563cbb6a52c845.png

关系运算符

5ffc26ef68d5274364e38436805bf11f.png

布尔运算符

753cfddeb1dbdf6e3b90e8bd3dbbb1f1.png

逻辑运算符

6da060e460546dfdd80ce8b49e9ed278.png

字符串运算符

a4f652af48e4e52ce1e6df813676e7ea.png

12 高频面试(笔试)shell实战

  • 请将当前目录中demo.txt第二行第三列数据输出到demo2.txt中
“ cat demo.txt|awk ’NR&#61;&#61;2{print $3}’ >demo2.txt
  • 日志如下统计访问ip最多的前10个
“ awk ’{print $1}’ *.log | sort | uniq -c | sort -nr | head -n

uniq - 删除排序文件中的重复行 sort对于文本进行排序 -l 按照当前环境排序. -m 合并已经排序好的文件,不排序. -n 按照字符串的数值顺序比较,暗含-b -r 颠倒比较的结果.

  • 查看占用内存最大的进程的PID和VSZ
“ ps -aux|sort -k5nr|awk ’BEGIN{print ”PID VSZ”}{print
5}’|awk ’NR<3′
  • 如何检查文件系统中是否存在某个文件

if [-f /var/log/messages]
then
echo "File exts"
fi

  • 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?
“ #!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本&#xff0c;就是 #!/usr/bin/python
  • &和&&区别
“ “&” 脚本在后台运行时使用它。“&&”当前一个脚本成功完成才执行后面的命令
  • 脚本文件中&#xff0c;如何将其重定向标准输出和标准错误流到 log.txt 文件 ?

./a.sh >log.txt 2>&1

  • 如何计算本地用户的数目

wc -l /etc/passwd | cut -d

  • shell中进行字符串比较和数字比较

[ $A &#61;&#61; $B ] – 用于字符串比较
[ $A -eq $B ] – 用于数字比较

  • 去掉字符串空格
“ echo $string | tr -d " "
  • 统计内存使用

#! /bin/bash
# author:xiaolan
sum&#61;0
for mem in &#96;ps aux |awk &#39;{print $6}&#39; |grep -v &#39;RSS&#39; &#96;
dosum&#61;$[$sum&#43;$mem]
done
echo "The total memory is $sum""k"

结果

55ba8bebde6454251415565d43c71325.png
  • 批量更改文件名
“ 批量修改123目录下txt为txt.temp。将temp打包为test.tar.gz

#!/bin/bash
##查找txt文件
find /123 -type f -name "*.txt" > /tmp/txt.list
##批量修改文件名
for f in &#96;cat /tmp/txt.list&#96;
domv $f $f.temp
done
##创建一个目录&#xff0c;为了避免目录已经存在&#xff0c;所以要加一个复杂的后缀名
d&#61;&#96;date &#43;%y%m%d%H%M%S&#96;
mkdir /tmp/123_$d
##把.temp文件拷贝到/tmp/123_$d
for f in &#96;cat /tmp/txt.list&#96;
docp $f.temp /tmp/123_$d
done
##打包压缩
cd /tmp/
tar czf 123.tar.gz 123_$d/

“ 本文主要记录shell编程初级知识&#xff0c;如有帮助麻烦给我点个赞&#xff0c;感谢



推荐阅读
  • 主调|大侠_重温C++ ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
author-avatar
杀你哥_52544
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有