input and output:
输入输出的重定向:
标准输入重定向(STDIN,文件描述为0):默认从键盘输入,也可以从其他文件或者命令 中输入
标准输出重定向(STDOUT,文件描述为1):默认输出到屏幕
错误输出重定向(STDERR,文件描述为2):默认输出到屏幕
参数:
输入重定向:
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,知道遇见分界符才停止 如:<< over就是分界符
命令 <文件1> 文件2 将文件1作为命令的标准输入并将标准输出到文件2
输出重定向:
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容后面)
命令 >> 文件 2>&1
命令 &>> 文件 这两个命令一样:将标准输出与错误输出共同写入到文件中(追加)
管道命令:把前一个命令原本要输出到屏幕的数据当作后一个命令的标准输入
ls -l /etc/ | more
echo “Linuxprobe” | passwd –stdin root
echo “Content” | mail -s “Subject” linuxprobe
mail -s “Readme” root@linuxprobe.com << over
命令行的通配符:
ls -l /dev/sda
ls -l /dev/sda1
ls -l /dev/sda2
ls -l /dev/sda3
….
通配符的使用:
ls -l /dev/sda*
如果后面是跟一个字符的文件的相关信息:
ls -l /dev/sda?
如果使用的是[0-9]来匹配0-9的单个数字的话:
ls -l /dev/sda[0-9]
ls -l /dev/sda[135]
常用的转义字符:
反斜杠():是反斜杠后面的一个变量变为单纯的字符串
单引号(”):转义其中所有的变量为单纯的字符串
双引号(“”):保留其中的变量属性,不进行转义处理
反引号(`):在左上方,把其中的命令执行后返回结果
命令
$$的作用是显示当前程序的进程ID号码 例如: PRICE=5 echo "price is /$$PRICE"
如果要某个命令的输出值时,可以使用,反引号扩起来
uname -a`
下面是显示本就的liunx版本和内核信息:
echo
重要的环境变量:
用户执行了一条命令之后,Linux执行4个步骤:
第一步:
判断用户是否以绝对路径或是相对路径的方式输入命令(/bin/ls),
如果是,则直接执行
第二步:
Liunx系统检查用户输入的命令是否为”别名命令”,即用了一个自定义的 命令名称来替换原本的命令名称。(alias)可以使用alias这个命令来 创建一个属于你自己的命令别名,格式为:alias 别名=命令。
要取消一个命令别名时,则是使用unalias命令,格式:unalias 别名
例如:
ls
rm test.txt
这里默认让你输入y/n
alias rm
先查看rm 的别名有什么命令
unalias rm
rm test1.txt
第三步:
Bash解释器判断用户输入的是内部命令还是外部命令。
内部命令是解释器内部指令,会被直接执行。
而用户在绝大部分时间输入的是外部命令
可以使用:type 命令名称 —-》判断输入的内部还是外部命令
例如:
type ls 就是外部命令
type touch 就是内部命令
第四步:
系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫 做PATH,可以简单的理解为”解释器的小助手“,作用是告诉Bash解释 器待执行的命令可能存放的位置,然后Bash解释器就会乖乖的在这些位 置中租个查找。PATH是由多个路径组成的变量,每个路径值之间用冒号
隔开,对这些路径的增加和删除操作都将影响到Bash解释器对Liunx命 令的查找
如果你想查看PATH:
echo PATH
PATH中增加值:
PATH=$PATH:/root/bin
Liunx系统中最重要的环境变量:
HOME 用户的主目录(及家目录)
SHELL 用户在使用的Shell解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器
例如:
//这里是root
echo $HOME
//切换用户
su - LVY//LVY是自己的普通用户
echo $HOME
//可以发现这两个用户的HOME是不同的
也可以自己定义一个变量
//root权限
mkdir /home/workdir
WORKDIR=/home/workdir
cd $WORKDIR
当时这样的变量不具有全局性,作用的范围是有限的
默认不可以被其他用户使用
可以使用export命令提升为全局变量,这样其他用户就可以使用了
su - LVY
cd $WORKDIR
echo $WORKDIR//不能使用
exit
export WORKDIR
su - LVY
cd $WORKDIR
pwd
Vim编辑器与Shell命令脚本
Linux 系统中的一切都是文件,而配置一个服务就是在修改其配置
文件的参数
了解:
vim编辑器设置了3种模式:命令模式,末行模式和编辑模式
Vim编辑器常用的命令:
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标出开始的5行
yy 复制光标所在的整行
5yy 复制从光标开始的5行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作
p 将之前删除(dd)或者复制(yy)过得数据粘贴到光标的后面
末行模式:
:w 保存
:q 退出
:q! 强制退出(不保存)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:命令 执行该命令
:整数 跳转到该行
:s/one/two 将当前光标所在行的第一个one替换成two
:s/one/two/g 将当前光标所在行的所有one替换成two
:%s/one/two/g 将全文中的所有one替换成two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
编写简单文档
a,i,o进入编辑模式
配置主机名称:
在Linux中主机大多保存在/etc/hostname文件中,
我们把/etc/hostname 文件的内容修改为"linux"
第一步:
使用Vim编辑器修改"/etc/hostname"主机名称文件
第二步:
把原始主机名称删除后追加"linux".
使用:wq!强制保存退出
第三步:
保存退出,然后使用hostname命令检查是否修改成功了
修改完成之后使用hostname命令查看
如果没有同步的话,可以进行重启查看
配置网卡信息:
在RHEL 5、RHEL 6中,网卡配置文件的前缀为eth,
第一块为eth0,第二块为eth1;一次类推
而在RHEL 7中,网卡配置文件的前缀则以ifcfg开始
加上网卡名称共同组成了网卡配置文件的名字,
例如:ifcfg-eno16777736;
配置一个名称为ifcfg-eno16777736的网卡设备,将其配置为开机启动
并且IP地址、子网、网关等信息有人工指定:
第一步:
首先切换到/etc/sysconfig/network-scripts目录中
这个目录存放着网卡的配置文件
第二步:
室友vim配置修改网卡文件ifcfg-eno16777736,保存退出
设备类型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
网卡名称:NAME=eno16777736
是否启动:ONBOOT=yes
IP地址:IPADDR=192.168.10.10
子网掩码:NETMASK:255.255.255.0
网关地址:GATEWAY=192.168.10.1
DNS地址:DNS1=192.168.10.1
第三步:
重启网络服务并测试网络是否联通。
操作:
cd /etc/sysconfig/network-scripts
vim ifcfg-eno16777736
设备类型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
网卡名称:NAME=eno16777736
是否启动:ONBOOT=yes
IP地址:IPADDR=192.168.10.10
子网掩码:NETMASK:255.255.255.0
网关地址:GATEWAY=192.168.10.1
DNS地址:DNS1=192.168.10.1
重新启动网卡设备的命令:
systemctl restart network
ping命令检查网络是否联通:
ping 192.168.10.10
配置Yum软件仓库:
它是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其
依赖关系的技术。
搭建Yum软件仓库并配置:
第一步:
进入到/etc/yum.repos.d/目录中
(该目录存放着Yum软件仓库的配置文件)
第二步:
使用vim编辑器创建一个名为rhel7.repo的新配置文件,
写入下面参数
[rhel-media]:yum软件仓库唯一表示符,避免和其他软件仓 库冲突
name=linuxYum:yum软件仓库的名称描述
baseusrl=file:///media/cdrom
提供的方式包括FTP(ftp://..)、HTTP(http://..)、
本地(file://..)
enabled=1:设置此源是否可用;1可用0不可用
gpgcheck=1:设置此源是否检验文件:1检验0不检验
gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat- relaase:若上面参数开启校验,那么请指定公钥文件地址
第三步:
按配置参数的路径挂载光盘,并把光盘挂载信息写入到
/etc/fstab中.
第四步:
使用"yum install httped -y"
命令检查Yum软件仓库是否已经可用
操作如下:
cd /etc/yum.repos.d/
vim rhe17.repo
[rhe17]
name=rhe17
baseusrl=file:///media/cdrom
enabled=1
gpgcheck=0
创建挂载点后进行挂载操作,设置为开机自动挂载
尝试使用Yum软件仓库来安装Web服务,出现Complete!
则正确:
mkdir -p /media/cdrom
mount /dev/cdrom /media/cdrom
vim /etc/fstab
#写入下面内容
/dev/cdrom /media/cdrom is09660 defaults 0 0
:wq!
yum install httped
编写Shell脚本
编写简单的脚本:
vim example.sh
#!/bin/bash//这是脚本声明,告诉系统使用哪种Shell解释器执行该 脚本
#For Example by linux
pwd
ls -al
执行脚本bash example.sh(也可以是用 sh example.sh)
还有一种放式输入完整路径来执行:./example.sh
可能会遇到权限不足:chmod u+x example.sh(修改权限)
接受用户的参数:
vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第五个参数为$5"
执行方法:
sh example.sh one two three four five six
判断用户的参数:
文件测试语句
逻辑测试语句
整数值比较语句
字符串比较语句
文件测试语句:
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 测试文件是否为一般文件
-r 测试文件是否有读取权限
-w 测试文件是否有写入权限
-x 测试文件是否有执行权限
例如:
下面判断/etc/fstab是否为一个目录类型文件
然后通过Shell解释器的内设$?变量显示上一条命令执行
后的返回值,为0则存在,非零值,不存在
[ -d /etc/fstab ]
echo $?
[ -f /etc/fstab ]
echo $?
逻辑测试语句
&&表示是前面一个表达式是否执行成功了
[ -e /dev/cdrom ] && echo "Exist"
||前面一个表达式执行失败了才执行它
[ -e /dev/IloveLinux ] || echo "No Exist"
!逻辑非,在条件判断中取反值
还是给个例子:
[ ! $USER = root ] && echo "user" || echo "root"
整数值比较语句:
-eq 是否等于(equal)
-ne 是否不等于(no equal)
-gt 是否大于(greater than)
-lt 是否小于(less than)
-le 是否小于或者等于(less or equal)
-ge 是否大于或者等于(freater or equal)
例子:
[ 10 -gt 10 ]
echo $?
[ 10 -eq 10]
echo $?
free -m 查看内存使用量情况(MB)
grep Mem(memory)过滤剩余内存量的行
awk '{print $4}' 保留第四行,
FreeMem='语句'把语句执行的结果给变量
free -m
free -m | grep Mem
free -m | grep Mem: | awk '{print $4}'
FreeMem=`free -m | grep Mem: | awk '{print $4}'`
echo $FreeMem
[ $FreeMem -lt 1024 ] && echo "Insufficient"
//绕了一个圈子,主要是使用-lt(less than)
比较字符串:
= 比较字符串的内容是否相同
!= 比较字符串的内容是否不同
-z 比较字符串的内容是否为空
为真返回的是1,为假返回的是0
例如:
[ -z $string ]
echo $?
echo $LANG
[ $LANG != "en.US" ] && echo "Not en.US"
流程控制语句:
if条件测试语句:
格式if、then、fi
例如:
vim mkcdrom.sh
#!bin/bash
DIR=”/media/cdrom”
if [ ! -e
DIR]thenmkdir−p
DIR
fi
执行命令:
bash mkcdrom.sh
ls -d /media/cdrom
//测试某台主机是否在线
Vim Chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null
if [ $? -eq 0]
then
echo "Host $1 is On-line."
else
echo "Host $1 is off-line."
fi
read -p 显示提示信息(输入信息的命令)
vim chkscore.sh
#!/bin/bash
read -p "please enter your score (0-100):" GRADE
if [ $GRADE -ge 100 ] || [ $GRADE -le 0 ];then
echo "你输入的信息有误\!"
fi
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
for条件循环语句
vim user.txt
andy
barry
carl
duke
eric
george
//批量创建用户
id 用户名 查看该用户的信息
vim Example.sh
#!/bin/bash
read -p "Enter The Users Password:" PASSWD
for UNAME in `cat users.txt`
do
id $UNAME $> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME,Create success!"
else
echo "$UNAME,Create failure."
fi
fi
done
判断是否成功,可以去/etc/passwd查看
判断主机是否在线
vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12
vim checkhosts.sh
#!/bin/bash
HLIST=$(cat ~/ippadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -w 3 $IP &> /dev/null
if [ $? -eq 0 ]; then
echo "Host $IP is On-Line."
else
echo "Host $IP is off-Line."
fi
done
//执行命令,完全路径
./CheckHosts.sh
while条件循环语句
vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)//expr命令取得结果
TIMES=0
echo "商品实际价格为0~999之间,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格:" INT
let TIMES++
if [ $INT -eq $PRICE ]; then
echo "答对了"
echo "你共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ]; then
echo "太高了"
else
echo "太低了"
fi
done
case 条件测试语句
vim checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按enter键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "输入的是字母."
;;
[0-9])
echo "数你的是数字."
;;
*)
echo "你输入的其他字符."
esac
计划任务服务程序:
”at 时间“ 的形式
查看已设置好的但还没有执行的一次性计划任务,可以使用”at -l命令”
想要将其删除,可以使用”atrm 任务序号”
例如:
使用命令将系统设置为今晚23:30分自动重启网站服务
at 23:30
at > systemctl restart httpd
at >此处按下Ctrl+D组合键结束编写计划任务
//更高简捷性
echo "systemctl restart htppd" | at 23:30
at -l
atrm 3
crond服务:
crondab -e 创建、编辑计划任务
crondab -l 查看当前计划任务
crondab -r 删除计划任务
crondab -u 编辑他人的计划任务(管理员)
口诀”分、时、日、月、星期 命令“
分 0~59
时 0~23
日 1~31
月 1~12
星期 0~7
命令 要执行的命令或是程序脚本
//每周一、三、五凌晨3点25分,党报某个网站的数据
//每周一到周五的凌晨1点清空/tmp目录
crontab -e
crontab -l
在所有的计划任务参数中,所有的命令一定要用绝对路径来写
当你不知道命令的绝对路径时:使用whereis进行查询
whereis rm
crontab -e
crontab -l
25 3 * * 1,3,5 usr/bin/tar -czvf backup.tar.gz /home/wwwroot 0 1 * * 1-5 usr/bin/rm -rf /tmp/*