linux第十天
shell脚本进阶与文件压缩打包
linux 第十天
shell入门进阶


((r=(5-2*2)/1)) 里面也会做数学运算
[-z 字符串]如果空值返回真, [-n 字符串]非空返回真
如果你要是输入这样的判断,是会返回真的:unset haha;[ -n $haha ] && echo true,因为$haha为空,但是它把-n也当作字符串了(当然并不是真的如此),因此变量在这种情况下还是加引号为空

一般的如果不涉及正则我们使用【】就好了,[[]] 是支持正则的:
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;}

当前进程所打开的文件的描述符:ls /proc/$$/fd -l
-d可以指向目录,[ -d /lib ] && echo true,但是这里这个lib如果并不是目录,但是它指向目录,还是会输出true。[ -L /lib ] && echo true,软连接的判断也true

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

-t 表示的文件描述符指的是上面提到过的ls /proc/$$/fd,可以测试,比如1是在列表种的:[ -t 1 ] && echo true
-N, 实际上说的就是mtime是否比atime要新
-O,有效用户和当前用户不一定是同一个人,比如suid,你继承自某个用户的权限

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

你直接输入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,两种写法是等价的。这里涉及到一个小公式:

也就是:
not a and not b = not (a or b)
not b or not a = not (a and b)
推导过程:

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

如果你不指定变量,那么将会保存到REPLY变量中。指定变量名存放:read name,交互输入
当然也可以同时赋值多个变量:rand name title age,输入kju ceo 20。但是我们一般不会这么赋值,因为你要是输入少了或者多了都会出现问题
-p参数,可以带提示:read -p "please input " username,提示并且输入的存到username中
-s用于输入密码,看不见输入过程,更多的看上图
当然我们既然是可以接受标准输入,那当然也可以这样:rand name < /etc/issue,但是只会读取第一行



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

.bash_profile会在内部调用.bashrc,.bashrc会在内部调用 /etc/bashrc
. 跟 source是同效的
bash_profile里面可以放我们自己的别名,函数以及环境变量

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

.bash_logout这个看名字就知道了

hash记录外部命令的历史命令
有i代表是交互式shell
文件查找与压缩(一)
locate和find都是拿来查找命令的。
locate命令可以快速的查找文件,是根据数据库来查询

如果你新建一个文件,使用locate可能找不到,因为没有在数据库中。locate是模糊搜索。
可以使用updatedb立刻更新这个数据库
locate只能找有权限访问的目录

find


find默认递归选项

还可以使用通配符 find /etc -name "network*"
注意,我们的name最好都加上“”
使用基本正则找到包含ls的路径或者.log结尾的:find /app -regex ".*ls.*\|.*\.log$"
可以搜索用户,搜索是kju用户的文件并且是sh结尾的:find -user kju147 -regex ".*\.sh$"
可以看出find默认就有并且关系


比如:find / -maxdepth 1 -type l -ls
并且是-a,或者是-o,也可以取反(!或者-not)
查找不是kju147或者不是sh后缀的文件:find ! -name kju147 ! -regex ".*\.sh$",如果要用括号扩起来那么就变成 find ! \(-user kju147 -o -regex ".*\.sh$"\)


关注下排除

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