linux第十天

shell脚本进阶与文件压缩打包

linux 第十天

shell入门进阶

avatar

avatar

((r=(5-2*2)/1)) 里面也会做数学运算

[-z 字符串]如果空值返回真, [-n 字符串]非空返回真

如果你要是输入这样的判断,是会返回真的:unset haha;[ -n $haha ] && echo true,因为$haha为空,但是它把-n也当作字符串了(当然并不是真的如此),因此变量在这种情况下还是加引号为空

avatar

一般的如果不涉及正则我们使用【】就好了,[[]] 是支持正则的:

var=haha;[[ "$var" =~ ha ]]&& echo true,这是可以匹配上,返回true

var=b;[[ "$var" =~ h+ ]]&& echo true 这也是真的

判断是否有sh后缀:var=haha.sh;[[ "$var" =~ .*\.sh$ ]] && echo true。注意要转义

上面的sh后缀判断,如果 =~后面是带引号的正则,那就false了,在正则里面的引号它真就认为这是引号了。

!!!!留意这个,var="haha*";[[ "$var" == "hahah*" ]]"&&echo true,这真是true,因为这是两个等号==。

var="hahassss*";[[ "$var" == hahah* ]]"&&echo true,这尼玛也是真,因为这里的*的意思是通配符

判断一个字符知是否是数字:[[ "$var" =~ ^[0-9]*$ ]] && echo true ||echo false

判断是否是数字并且是否相等(不是数字直接报语法错误):num=10;[ $num -eq 10 ] && echo true

比较大小:

  • 是否大于10:num=20;[ "$num" -gt 10 ] ;echo true
  • 是否小于10:num=1;[ "$num" -lt 10 ];echo true
  • 什么小于等于,你带上e就是等号了,这是小于等于的:num=1;[ "$num" -le 10 ];echo true

判断是否被赋值过(存在):例子输出false,注意不能加引号以及$:unset var;[ -v var ]||echo false

可以对变量取反:[ -! “ “ ] && echo true || echo false

记住:$1,$2这些都是系统有的变量,只是没有赋值,用大括号可以统计多个命令:[ -n "\$1"] || {echo -e "The ara must one\nUseage:createuser.sh username" &&exit 20;}

avatar

当前进程所打开的文件的描述符:ls /proc/$$/fd -l

-d可以指向目录,[ -d /lib ] && echo true,但是这里这个lib如果并不是目录,但是它指向目录,还是会输出true。[ -L /lib ] && echo true,软连接的判断也true

avatar

-g判断guid权限(g+s),-u判断suid

avatar

-t 表示的文件描述符指的是上面提到过的ls /proc/$$/fd,可以测试,比如1是在列表种的:[ -t 1 ] && echo true

-N, 实际上说的就是mtime是否比atime要新

-O,有效用户和当前用户不一定是同一个人,比如suid,你继承自某个用户的权限

avatar

比较新旧:[ f1 -nt file1 ] && echo true ||echo false,f1比file1的mtime旧,return false

avatar

你直接输入true或者false,echo $?会同样返回0和1,他们本身就是系统命令

使用-a或者-o命令:[ -r f1 -a -w f1 ] && echo true

表示一个文件既不可读有不可写:[ ! \( -r f1 -o -w f1 \) ] && echo true || echo false,可以用小括号括起来。当然你也可以分开写: [! -r f1 -a ! -w f1] && echo true,两种写法是等价的。这里涉及到一个小公式:

avatar

也就是:

not a and not b = not (a or b)

not b or not a = not (a and b)

推导过程:

avatar

禁止普通用户登陆,简单只要创建一个文件就行:touch /etc/nologin,里面可以写点提示语

avatar

如果你不指定变量,那么将会保存到REPLY变量中。指定变量名存放:read name,交互输入

当然也可以同时赋值多个变量:rand name title age,输入kju ceo 20。但是我们一般不会这么赋值,因为你要是输入少了或者多了都会出现问题

-p参数,可以带提示:read -p "please input " username,提示并且输入的存到username中

-s用于输入密码,看不见输入过程,更多的看上图

当然我们既然是可以接受标准输入,那当然也可以这样:rand name < /etc/issue,但是只会读取第一行

avatar

avatar

avatar

我们用户一登陆,就会运行bash,运行bash,就会读取一些配置文件:

avatar

.bash_profile会在内部调用.bashrc,.bashrc会在内部调用 /etc/bashrc

. 跟 source是同效的

bash_profile里面可以放我们自己的别名,函数以及环境变量

avatar

.(或者source)跟bash有啥区别,.(source)可以理解成是在当前进程执行,bash会是开一个进程。一般我们.(或者source)会执行一些对系统环境改变的脚本(配置文件)

avatar

.bash_logout这个看名字就知道了

avatar

hash记录外部命令的历史命令

有i代表是交互式shell

文件查找与压缩(一)

locate和find都是拿来查找命令的。

locate命令可以快速的查找文件,是根据数据库来查询

avatar

如果你新建一个文件,使用locate可能找不到,因为没有在数据库中。locate是模糊搜索。

可以使用updatedb立刻更新这个数据库

locate只能找有权限访问的目录

avatar

find

avatar

avatar

find默认递归选项

avatar

还可以使用通配符 find /etc -name "network*"

注意,我们的name最好都加上“”

使用基本正则找到包含ls的路径或者.log结尾的:find /app -regex ".*ls.*\|.*\.log$"

可以搜索用户,搜索是kju用户的文件并且是sh结尾的:find -user kju147 -regex ".*\.sh$"

可以看出find默认就有并且关系

avatar

avatar

比如:find / -maxdepth 1 -type l -ls

并且是-a,或者是-o,也可以取反(!或者-not)

查找不是kju147或者不是sh后缀的文件:find ! -name kju147 ! -regex ".*\.sh$",如果要用括号扩起来那么就变成 find ! \(-user kju147 -o -regex ".*\.sh$"\)

avatar

avatar

关注下排除

avatar

仔细看描述,如果你是写find /etc -size 1k这样的话你可能会找出很多文件,因为它找的是>0<=1k的文件,但是如果要精确的找1k:find /etc -size 1024c

avatar


linux第十天
http://www.kju147.com/2018/12/27/linux第十天/
作者
个人学习
发布于
2018年12月27日
许可协议