防火墙(ufw)
- 说明:简单版本的防火墙,底层依赖于iptables。
- 安装:sudo apt-get install ufw
- 查看状态:sudo ufw status
- 开启/关闭:sudo ufw enable|disable
- 默认允许/禁止:sudo ufw default allow|deny
- 允许/禁止:sudo ufw allow|deny 服务|port,如:sudo ufw deny ssh
- 移除规则:sudo ufw delete deny ssh
管道及xargs
- |:管道,将前面命令的输出作为后面命令的输入参数,如:ls /bin | grep ‘^m’
- xargs:有些命令无法接收管道参数,可以通过xargs解决,如:find -name 1.sh | xargs rm -rf
重定向
- 三个数据流:标准输入(stdin)、标准输出(stdout)、标准错误(stderr)
- 在linux,启动任意的进程,系统会自动创建上面三个数据流,其实就是三个文件
- 三个文件的描述符分别是:0、1、2,都指向了终端
- 重定向就是改变原来的表现位置。
- 示例演示:
输出重定向:
ls > 1.txt # 将ls的输出结果保存到1.txt文件中,会新建文件1.txt,若文件存在则会清空
ls >> 1.txt # 将ls的输出结果追加到1.txt文件中,文件不存在也会创建
错误重定向:
ls /xxx 2> 2.txt # 将错误信息保存到2.txt
同时重定向输出和错误:
ls /xxx /home &> 3.txt # 同时将错误和输出保存到3.txt文件中
shell简介
- 什么是shell编程?
- 将终端下编写的命令等保存到文件中,就称为shell编程。
- shell类型?
- ash、bash、csh、ksh
- 查看系统shell解析器:echo $SHELL
- 当前系统可以shell解析器:/etc/shells文件
- shell脚本的执行
shell变量
- 变量定义:name=‘dahua’,’='两边不能有空格
- 打印变量:echo $name 或 echo ${name}
- 销毁变量:unset name,之后就不能再使用
- 声明常量:readonly name=‘dahua’
- 使用说明:’='两边不能有空格,只读变量不能修改
变量分类
- 本地变量:只适用于当前shell的变量
- 环境变量:适用于整个系统,通常都是纯大写的
- 查看系统环境变量:env
- 查看指定环境变量:echo $PATH
- 若想在任意位置都可执行指定程序,可以将程序所在的路径添加到环境变量PATH。
- 修改:
- 单次:export PATH=$PATH:/home/jerry/shell
- 永久:
- 系统:/etc/profile
- 用户:/.profile、/.bashrc、~/.bash_profile
- 把导出的语句添加到文件末尾即可
- 使文件生效:重启终端 或 source ~/.bashrc
- 位置变量:
- $0:执行脚本的名字
- $1 ~ $9:传递给脚本的参数
- 特殊变量:
- $#:传递给脚本的参数个数
- $*:传递给脚本的所有参数
- $?:上次命令的执行情况,0表示正确,其他表示错误
字符串类型
- 单引号:其中的字符都会原样输出,不会被解析
- 双引号:可以放除了$、`、\、"以外任意字符,其中的变量等会被解析
- 反引号:将其中的内容作为命令执行,如:
echodate
- ‘’:转义特定的字符,如:$、*、\、?、|、`、^、&
- 字符串长度:${#name}
- 字符串提取:${name:2:3},从变量name中下表为2的地方提取3个字符
数组类型
- 定义:a=(1 2 3)
- 成员访问:echo ${a[2]}
- 个数统计:echo ${#a[@]}
- 所有元素:echo ${a[*]}
seq
- 说明:生成指定范围的连续整数
- 示例:seq 10,生成1~10的连续整数,seq 2 10,生成2~10的连续整数
expr
- 说明:运算一个表达式
- 示例:
expr 2 + 3 结果为5
echoexpr 3 + 5
结果会打印8
expr 3 * 5 结果为15,*需要转义
各种运算
-
test命令:成功为真,失败为假。
#!/bin/bashif test 1 -lt 2; then echo 'ok' fi if [ 1 -lt 2 ]; then echo 'okok' fi
-
数值比较运算
- -lt:小于
- -le:小于等于
- -gt:大于
- -ge:大于等于
- -eq:等于
- -ne:不等于
-
字符串测试
- =:相等
- !=:不相等
- -z:字符串的长度是否为0
- -n:字符串的长度是否不为0
-
文件判断
- -f:普通文件
- -d:目录文件
- -c:字符设备文件
- -b:块设备文件
- -w:是否可写
- -x:是否可执行
- -s:文件存在,并且至少有一个字符
-
逻辑运算
-
-a:逻辑与(and),也可以使用&&来代替
-
-o:逻辑或(or),也可以使用||来代替
-
!:逻辑非
-
示例:
#! /bin/bashif [ 1 -lt 3 -a 2 -lt 3 ]; then
echo ‘ok’
fiif [ 1 -lt 3 ] && [ 2 -lt 3 ]; then
echo ‘ok’
fiif [ ! 1 -gt 3 ]; then
echo ‘xxx’
fi
-
分支结构
-
if-elif-else:
#! /bin/bashif [ 8 -lt 3 ]; then echo '8 < 3' elif [ 8 -lt 9 ]; then echo '8 < 9' else echo 'xxx' fi
-
case:
#! /bin/bashread -p 'please input any charactor:' ch case $ch in [a-z]) echo 'alpha' ;; [0-9]) echo 'numberic' ;; *) echo 'others' ;; esac
循环结构
-
for-in 及 for
#! /bin/basha=(1 2 3 4 5) # for x in a b c # for x in /etc/* # for x in `seq 1 10` for x in ${a[*]} do echo $x done for ((i=0;i<${#a[@]};i++)) do echo ${a[$i]} done
-
while
#! /bin/bashi=1 sum=0 while [ $i -le 100 ] do #((sum+=$i)) #((i++)) #let sum+=$i #let i++ sum=$[$sum+$i] i=$[$i+1] done echo $sum
-
until:条件成立,循环停止
#! /bin/bashi=1 until [ $i -gt 10 ] do echo $i ((i++)) done
-
break、continue自行学习
函数使用
-
demo(){ echo 'for func' } demo
arg(){
echo $1
echo $2
echo $*
echo $#
return 250}
arg abc def
$?表示函数的返回值
echo $?