shell实战总结

2022/1/30 7:09:30

本文主要是介绍shell实战总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

shell_01

文件表达式

if [ -f file ] 如果文件存在
if [ -d … ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行

整数变量表达式

if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<

字符串变量表达式

if [ $a = $b ] 如果string1等于string2
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空
if [ $sting ] 如果string 非空,返回0 (和-n类似)

s​h​e​l​l​中​条​件​判​断​i​f​中​的​-​z​到​-​d​的​意​思

[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。 [
-p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。 [ -L FILE ] 如果
 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it 
was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more
 recently than FILE2,or 如果 FILE1 exists and FILE2 does not
则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且
 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。

位置参数

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

(1)其语法格式为:
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]

使用说明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除。

(2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?

cut命令主要是接受三个定位方法:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

[ ] : [ condition ] 为判断符,其中的条件condition为真返回 0,假返回 1 。

echo : echo str 打印字符串 str (默认换行)

-eq : int1 -eq int2 是整数相等判断符,两边整数相等时返回真 0,否则返回假 1 。

$? : $ 符号用来引用变量的值,? 是一个特殊的变量,存储紧邻的前驱命令执行的返回值,$? 一般组合用来检查上一个命令执行结果的返回值。

exit : exit 0~255 ,用来返回自己的退出状态码,超过255的值 将被自动执行 模256的运算。

shell_02

在bash中,$( )与` `(反引号)都是用来作命令替换的

命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

shell 扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令
$(( )) 可以 整数运算、进制转换、重定义变量值

sed -e 是可以在一行里执行多条命令

sed -e ‘s/wang/w/g;s/xu/x/g’ user.txt,

顺便说一下 's/wang/w/g;s/xu/x/g’的意思,s代表search,g是尽可能多的匹配,有多少替换多少,因而意思是将user.text文本中的wang 替换成w,xu 替换成x

字符通配

. 匹配任意单个字符
[ ] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z
[:lower:] 小写字母[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

1、字符集 [:与:]
2、排序符号 [.与.]
3、等价字符集 [=与=]

在这里插入图片描述

shell_03

tr命令

tr字符可以对来自标准输入的字符进行替换、压缩和删除,可以将一组字符编程另外一组字符,作用很强大。

tr  [option]  [char_set 1]  [char_set 2]
tr命令将“ set 1”中的字符集替换为“ set 2”。 

tr -c -d -s
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

shell_04

指定 : 号分隔符,显示第一列

cut -d":" -f1 filename
cut -d: -f1 filename

getopts命令格式:getopts OPTSTRING VARNAME
OPTSTRING:告诉getopts会有哪些选项和参数(用选项后面加“:”来表示选项后面需要加参数)
VARNAME:保存getopts获取到的选项

getopts ahf: var
告诉getopts查找-a、-h、-f选项,其中f选项后面需要跟一个参数,获取到的选项都保存到变量var中
while getopts :hvf: o: varname #告诉getopts此脚本有-h、-v、-f、-o四个选项,-f和-o后面需要跟参数

OPTIND: getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态。
OPTARG: 在上面的循环中,a,b两个参数后面各有一个冒号,冒号表示该输入的参数后面还有一个参数值,当getopts发现冒号后,会处理用户输入的参数值,这个参数值被保存在OPTARG中。

root@GO-EMAIL-1 ~]# sh 1.sh -ab foo
sh 1.sh -ab foo
-ab 第一个元素,OPTIND=1
foo 第2个元素, OPTIND=2
第3个元素为空 OPTIND=3
所以处理-a时,下一个是b,依然在处理第一个元素,所以打印
a=1
处理b时,下一个是foo,但foo不是参数SKIP掉了,下一个参数是空,optind=3
所以打印
b=3

在这里插入图片描述

重要

. 可以将另一个脚本放到执行脚本中运行

在执行脚本中加入
	. 导入的脚本名

shift n后,前n位参数都会被销毁(偏移)

在这里插入图片描述
在这里插入图片描述

关于cat << EOF语句的意思

cat<<EOF,以EOF输入字符为标准输入结束:
cat>filename,创建文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束:
cat>filename<<EOF,以EOF作为输入结束,和ctrl+d的作用一样:

如果重定向的操作符是<<-,那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。

basename命令只要是用于去除路径文件后缀部分的文件名或者目录名

1.basename 文件(目录) //删除路径最后一个"/“符号(包括”/")前面的所有内容
2.basename 文件或目录 后缀(后缀:可选参数,指定要去除的文件后缀字符串)

date 可以用来显示或设定系统的日期与时间。

-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; 
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; 
-u:显示GMT; 
--help:在线帮助; 
--version:显示版本信息。

日期格式字符串列表

如果需要以指定的格式显示日期,可以使用“+”开头的字符串指定其格式

%H 小时(以00-23来表示)。 
%I 小时(以01-12来表示)。 
%K 小时(以0-23来表示)。 
%l 小时(以0-12来表示)。 
%M 分钟(以00-59来表示)。 
%P AM或PM。 
%r 时间(含时分秒,小时以12小时AM/PM来表示)。 
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。 
%S 秒(以本地的惯用法来表示)。 
%T 时间(含时分秒,小时以24小时制来表示)。 
%X 时间(以本地的惯用法来表示)。 
%Z 市区。 
%a 星期的缩写。 
%A 星期的完整名称。 
%b 月份英文名的缩写。 
%B 月份的完整英文名称。 
%c 日期与时间。只输入date指令也会显示同样的结果。 
%d 日期(以01-31来表示)。 
%D 日期(含年月日)。 
%j 该年中的第几天。 
%m 月份(以01-12来表示)。 
%U 该年中的周数。 
%w 该周的天数,0代表周日,1代表周一,异词类推。 
%x 日期(以本地的惯用法来表示)。 
%y 年份(以00-99来表示)。 
%Y 年份(以四位数来表示)。 
%n 在显示时,插入新的一行。 
%t 在显示时,插入tab。 
MM 月份(必要) 
DD 日期(必要) 
hh 小时(必要) 
mm 分钟(必要)
ss 秒(选择性) 


这篇关于shell实战总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程