bash
环境变量定义:
export name = jary
取消全局变量:unset name
位置变量定义:
$1,$2...,
$0表示执行脚本时的路径和本身如:basename $0
shift:参数轮换
特殊变量:
$?:上一个进程状态返回值
$#:参数个数
$*:参数列表
$@:参数列表
程序执行:可能有2类返回值
程序执行结果
程序状态返回代码(0-255):
0:表示正确
1-255:错误执行 1,2,127这三个系统预留
查看shell中变量:用set 不带任何参数,包含环境变量和本地变量
查看当前shell环境变量:
printenv
$PATH
export
条件语法:
if 条件表达式;then
表达式
elif 条件表达式;then
表达式
else
表达式
fi
条件测试:(整数测试,字符测试,文件测试)
格式:注意:表达式与中括号必须有空格,否则会报语法错误
[ 表达式 ]:
[[ 表达式 ]]
test 表达式
整数测试:a=3 b=3 c=5 d=2
-eq:相等 [ $a -eq $b ] echo $?
-ne:不等于 [ $a -ne $b ] echo $?
-gt:大于[ $a -gt $c ]
-lt:小于[ $d -lt $c ]
-ge:大于等于[ $d -ge $d ]
-le:小于等于[ $a -le $c ]
!:取反,id user 如果不存在就添加用户
文件测试:
-e:文件/目录是否存在 [ -e /user1/a1.ini ]
-f:是否为普通文件[ -f /user1/secoud.sh]
-d:是否为目录[ -d /user1/tp]
-r:对当前用户来说,文件和目录是否可读[ -r /user1/a1.ini ]
-w:对当前用户来说,文件和目录是否可写[ -r /user1/tp ]
-x:对当前用户来说,文件是否可执行[ -x /user1/secound.sh ]
字符串测试:
==:等于[ $a == $b ]
!=:不等于[ $a != $b ]
-n 字符串:测试指定字符串是否为非空,非空为真,空为假
-z 字符串:测试字符串为空,空为真,不空为假
逻辑关系:
条件1&&条件2:条件1为真,判断条件2是否为真,条件1为假,不用判断条件2
条件1||条件2:条件1为假,判断条件2是否为真,条件1为真,不用判断条件2
组合条件:
-a:与 [ $a -gt $b -a $c == "abc" ]
-o:或[ $a -ge $b -o $c == "abc" ]
!:非
算数运算:
let:算数运算表达式 let c=$a+$b
$[ 算数运算表达式 ] c=$[ $a+$b]
$(( 算数运算表达式 )) c=$(( $a+$b ))
expr:表达式中各操作数值与运算符要有空格,而且要使用命令引用 c= `expr $a + $b`
exit:退出脚本,中断进程
bash -n 脚本名称,测试脚本是否有语法错误
bash -x 脚本名称:脚本没一行执行过程
sed:流编辑器,也是行编辑器,默认修改源文件
格式:sed [options]“addresscommand” file...:对文件符合地址的行,执行编辑命令
-n:不在默认显示默认空间的内容 sed ‘$=’ a1.ini打印总行数
-i:直接修改源文件
-e:可以使用多个addresscommand
-f file:读取文件的多个addresscommand
-r:支持使用扩展的正则表达式
address:
开始行,结束行: 直接指定行如:1,100 从第1行开始,到第100行结束
$:表示最后一行
/正则表达式/: 模式匹配如:/^root/
/pattern1/,/pattern2/:从第一次匹配的pattern1行开始,到第二次匹配的pattern2行结束,这中间的行
一个数字:直接指定某行
一个数字 +n:表示从这数字行开始,执行n行
command:
d:删除如 sed ’1,2d‘ /user1/a1.ini
p:匹配上的显示2次,没匹配上的显示一次(一次是p处理显示的,一次还是在模式空间里,若加上-n则只显示匹配上的内容) sed -n ‘/sh$/p’ /user1/a1.ini
a \字符串或a字符串:在指定行后面添加新行内容(字符串)sed '1,3aToday is luck'
i \字符串 或 i字符串:在指定的行前面添加新行内容(字符串)sed '/^.r/iToday is luck' a1.ini
r file:将在符合条件的行添加新行,新行内容是file文件里面的全部内容如:sed '2r /user1/n1.log' a1.ini
w file:将匹配上的行添加到file文件后面如:sed '/^to/w /user1/n1.log' a1.ini
s/pattern1/字符串/修饰符:表示把匹配上的行的pattern1(可以正则表达式,也可以字符)替换成字符串如:sed ‘/sh$/s/[[:upper:]]/99/’ a1.ini,注意:不加修饰符,是每行替换第一个
修饰符:
g:全部替换如sed ‘/^-/s/a/uu/g’ a1.ini
i:忽列大小写sed '/^-/s/m/YY/i' a1.ini
&:引用模式匹配整个字符串如:sed ‘1s#[[:lower:]]#&8#g’ a1.ini 把第一行的每个小写字母都加上8,注意s/pattern1/字符串/修饰符分割符可以写成s#pattern1#字符串#修饰符,只要相同就行了
如:sed ‘2s#\(..e\)#L\1#g’ a1.ini 把正则表达式(..e)匹配上的字符串替换成L..e
循环语句:
for:
格式:
for 变量 in 列表变量;do
表达式
done
which
until
列表:
{1..100}:表示1到100整数
seq 开始数 【间隔数】 结束数如:seq1 100,seq 2 2 20,seq 10
declare :
-i sum :参数sum是整数
-x :表示声明环境变量
vim 按
i:转入光标前面进入输入模式
a:转入光标后面进入输入模式
o:在光标所在行的下面新增一行
ESC:退出输入模式
:转入末行,也就是末行模式,进入末行模式后按ESC转回编辑模式
:q不保存退出
:wq不保存退出
v:进入视图模式
p:粘贴
y:复制
vim 文件1 文件2,在末行模式下next可以切换到文件2,用prev可以切换到文件1
在末行模式下set nu显示行号,set noun,永久行号:/etc/vimrc(/etc/virc)最后加入一行 set number,或家目录新建.vimrc文件,并添加set number
文件查找:
locate:非实时的,模糊查找是根据全系统文件数据库进行的,updatedb 手动生成文件数据库如locate passwd
find:
格式:find 路径 标准 查找到以后的动作(路径:默认当前目录,标准:默认当前路径下的所有文件,查找到以后的动作:默认显示)
标准:
-name :根据文件名查找 find -name sh*
-iname:不区分大小写 find -iname u.sh
-regex:使用正则表达式(必须包括路径匹配)
-user:根据文件属主查找
-group:根据文件属组查找
-uid:根据uid查找
-gid:根据gid查找
-nouser:查找没有属主文件
-nogroup:查找没有属组文件
-type:
f:普通文件
d:mulu
c:字符设备
b:块设备
l:链接文件
p:管道设备
s:套子文件
-size [+或-]:根据大小查找
k:有+或-表示大于或等于多少k,1k表示0到1k,
M:有+或-大于或小于多少M 10M表示9M到10M
G:有+或-大于或小于多少G
-mtime[+或-]:根据修改时间查找,+5表示5天前修改,-5表示5天内到现在,5表示第5天
-atime[+或-]:
-ctime[+或-]:
-mmin[+或-]:根据分钟查找,+5表示5分钟前修改,-5表示5分钟内修改,5表示第5分钟修改
-amin[+或-]:
-ctime[+或-]:
-perm[/或-] 根据权限查找,find -perm 644,表示精准匹配权限为rw-r--r--文件,find -perm /644 表示个权限中至少有一个匹配的,find -perm -644 表示权限完全包含rw-r--r--文件
动作:
-print:默认显示
-ls:类似与ls -l
-ok 命令 {}\;如 find -perm 006 -ok chmod o-w {}\; 表示找到权限为------rw-文件并把其他组的w权限去掉,{}表示文件名,这命令会每个需要由用户确认
-exec 命令 {}\;如find -perm 007 -exec chmod o-x {}\; 表示找到权限为------rwx文件并把其他组的x权限去掉,{}表示文件名,这命令不需要由用户确认,直接改
xargs:与find搭配使用和exec差不多,只是显示不同例如:
find ./ -size +1k -exec echo {} >> a1.ini \;
显示为a1.txt
a2.txt
find ./ -size +1k | xargs echo >> a1.ini
显示为a1.txt a2.txt
组合条件:
-a:与
-o:或
-not:非
特殊权限:
SUID:当某文件有suid权限,运行某进程时,相应进程的属主是程序文件自身的属主,不在是启动者 例如chmod u+s /bin/cat
SGID:当某目录有guid权限,新建文件的属组是目录自身的属组,不在是创建者的属组 例如chmod g+s /user2,这目录的属组是mygroup ,用户的附加组是mygroup,这样只有属于mygroup用户都可以访问目录user2,并可以删除其他用户创建的文件
Sticky:在一个公共目录,可以新建删除自己文件,但无法删除别人创建的文件如:chmod o+t /users1
文件系统访问列表(facl):利用文件的扩展属性保存额外的访问控制权限
setfacl:
-m:设定额外访问权限列表,注意权限不能超出mask(不固定)的权限
u:用户:rwx:设定某用户有某权限 setfacl -m u:user1:rw n2.log
g:组名:rwx:设定某组有权限setfacl -m g:mygroup:rw n2.log
用得不多命令: d: u:用户:rwx:表示设定目录的,以后在此目录下新建文件会默认继承该目录的权限
用得不多命令:d:g:组名:rwx:表示设定目录的,以后在此目录下新建文件会默认继承该目录的权限
-x:取消额外访问权限
u:用户 setfacl -x u:user1 n2.log
g:组名 setfacl -x g:mygroup n2.log
--mask:指定mask
getfacl:如getfacl n2.log
whoami:显示当前谁登录了系统
who:显示谁登录系统
-r:显示运行级别
w:和who差不多,显示多了用户干了什么
last:显示那个用户登录了系统和系统重启系统,这些信息在/var/log/wtmp文件内容
lastd:显示用户错误登录系统,/var/log/btmp
lastlog:显示每个用户上次登录时间
-u 用户名
basename:显示路径的文件名,就是显示文件名,显示不了目录
sleep 5 :沉睡5秒,可以用来做每个5秒做什么事情
mail:显示邮件信息,邮件信息反正家目录mbox,如:cat /user1/n2.log | mail -s “邮件主题” root 表示给root用户发邮件
$HOSTNAME:当前主机主名,echo “$HOSTNAME”
hostname 主机名:修改主机名
RANDOM和URANDOM:生成0-32768随机数
对应生成器:/dev/random(会堵塞,加密安全),/dev/uramdom(不会堵塞,加密不太安全)
case:
case 变量 in
值1)
表达式
;;
值2)
表达式
;;
*)
表达式
;;
esac
:

浙公网安备 33010602011771号