linux支持哪些shell?Bourne Shell、BASH、Korn Shell、C Shell
查看所在文件:/etc/shells
比如一些命令,nologin----禁止用户登录、history----命令历史表等等
1、shell输入输出
命令有:echo、read、cat和管道符+重定向、tee
标准输入、输出和错误信息
echo
echo命令可以显示文本行或变量取值,或者把字符串输入文件中。
格式:echo 字符串
使用:创建一个sh文件,输入简单的命令并保存,再执行命令
vim 1.sh
#!/bin/bash
echo "开始"
echo "内存"
free -h
echo "空间"
df -h
echo "结尾"
执行:./1.sh
√脚本的执行:
----路径执行(绝对路径/相对路径)
./1.sh 相对
./root/1.sh 绝对
----sh或bash命令执行
sh 1.sh 或 bash 1.sh
sh /root/1.sh 或 bash /root/1.sh
---- . 或source执行
. 1.sh 或source 1.sh
. /root/1.sh 或source /root/1.sh
√变量取值
1)声明和赋值
num=123
echo $num
num="123"
Num=${num}abc
等号左右不要有空格(如有空格,加引号)
变量名严格区分大小写
变量名可以字母、字母+数字,不允许纯数字
2)查看变量取值(`` ☞反撇号)
num="123"
Num=${num}abc
echo "num的值是$num,Num的值是$Num"
num=123
Num=345
expr $num + $Num
num2=`expr $num + $Num`
或
num2=$(expr $num + $Num)
3)清除变量
num=123
unset num
定义和清除变量,变量名的前面不需要$
引用变量时,变量名必须加$
4)变量类型
☞用户自定义变量
☞环境变量(系统、用户),查看命令:
env
或
echo $PATH
☞位置变量
查看端口号是否被占用:
netstat -nao | grep 22
√命令的执行
1)判断内部命令/外部命令
type 命令名
2)内部命令,直接执行
外部命令:先找到命令文件,再执行
当前目录找不到,找PATH
√转义符
1)普通字符转义为特殊字符
\n----换行
\t----水平跳格
\v----垂直跳格 echo -e
2)特殊字符转义为普通字符
rm -rf 123\*
echo \$num
√引号
1)双引号
识别特殊字符,比如$、\、“”、``等
2)单引号
除了单引号本身,没有特殊符号----所见即所得
3)反撇号/反引号
`expr 123 + 234`
ll `find /etc -name "ifcfg*" -type f `
find /etc -name "ifcfg*" -type f | xargs ls -l
grep `echo $SHELL ` /etc/passwd
date命令:
read
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志
-p 后面跟提示信息,即在输入前打印提示信息
-e 在输入的时候可以使用命令补全功能
-n 后跟一个数字,定义输入文本的长度,很实用
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码
-t 后面跟秒数,定义输入字符的等待时间
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的
举例:
read -p "是否删除普通文件?(yes/no)" n
read n1 n2 n3
# 输入 123 124 125
# 输出
echo $n1 $n2 $n3
linux中的"三剑客":
grep 更适合单纯的查找或匹配文本
举例:
ps -ef grep ssh
sed 更适合编辑匹配到的文本
sed参数信息
-n 取消默认输出
-r 识别扩展正则
-i 将内存中的 信息覆盖到磁盘中
-e 识别sed命令多个操作指令
说明:-ni同时用,会把文件清空
举例:
ip a s eth0 |sed -rn '3s#^.*net(.*)/24.*#\1#gp'
awk 更适合格式化文本,对文本进行较复杂格式处理
语法格式:awk ‘{pattern + action}’ {filenames}
命令 + 参数 + 模式-动作 + 文件
print----显示第几列
NR----显示第几行
举例:
free -h | awk 'NR==2{print $4}'
tee
tee -a 文件名
(a表示追加)
动态查看,实时监控(带.log、.out后缀名的文件)
tail
tail -f 文件名
(显示最后10行,之后显示最新内容)(多个文件)
tailf 文件名
(一个文件)
重定向
√标准输出(命令/脚本的正确结果)
√标准错误(命令/脚本执行产生的报错)
1)2> 文件名
文件不存在,会被创建;文件存在,原内容被覆盖
2)2>> 文件名
文件不存在,会被创建;文件存在,则追加,保留原内容
√标准输入
1)> 文件名
文件不存在,会被创建;文件存在,原内容被覆盖
2)>> 文件名
文件不存在,会被创建;文件存在,则追加,保留原内容
举例:
输出正确和错误信息同时保存
sh 12.sh > 12.log 2> &1
或
sh 12.sh &> 12.log
正确结果保存在12.log,错误信息保存在系统垃圾箱
sh 12.sh > 12.log 2> /dev/null
sh 12.sh &> /dev/null
ping 172.20.149 >> ping.out &
2、shell后台执行命令
将命令/脚本放到后台执行
1)命令执行过程中,ctrl+z
2)命令执行一开始就放到后台
命令 &
查看后台命令:jobs
[1]后台任务号
+stopped 暂停
举例:
输入命令:vi 1.log
直接ctrl+c
终止后台任务:
----kill %后台任务号
----kill 进程号
先查看进程号ps -ef | grep vi
,再kill -9 进程号
3)后台任务重新拿到前台来执行
fg %后台任务号
3、定时任务(crontab)
默认当前用户下home目录
* * * * *
每个*号分别代表分时日月周
举例:
每分钟执行一次
***** echo "hi~" >> hi.log
***** sh /root/1.sh >> 1.log
每小时的第10分钟执行一次
10**** echo "hi~" >> /opt/hi.log
每隔10分钟执行一次
*/10**** echo "hi~" >> /opt/hi.log
每天12:10执行一次
1012*** echo "hi~" >> /opt/hi.log
每个月1号的12点10分执行一次
10 12 1 ** echo "hi~" >> /opt/hi.log
每年的7月1号的12点10分执行一次
10 12 1 7 * echo "hi~" >> /opt/hi.log
7月的每周三的12点10分执行一次
10 12 * 7 3 echo "hi~" >> /opt/hi.log
每天12点第1分钟到第5分钟执行一次
1-5 12 *** echo "hi~" >> /opt/hi.log
每天12点10分、12点30分执行一次
10,30 12 *** echo "hi~" >> /opt/hi.log
相关命令:
查看定时任务服务状态
systemctl status crond
systemctl start crond
systemctl stop crond
编辑定时任务
crontab -e
查看定时任务
crontab -l
清除定时任务
crontab -r
每个用户都可以拥有自己的定时任务
root用户可以编辑、查看、删除、增加其他用户定时任务
crontab -u 用户名 -e
crontab -u 用户名 -l
crontab -u 用户名 -r
4、shell语法
1)if 条件判断
if [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
else
语句
fi
注:语句之间不换行,要加分号
2)字符串判断
[ 字符串 = 字符串 ]
[ 字符串 != 字符串 ]
3)数值判断
[ 数值 操作符 数值 ]
操作符 | 表示 |
---|---|
-eq | = |
-ne | != |
-lt | < |
-le | <= |
-gt | > |
-ge | ge |
题目:获取网络内可用的ip地址(host找不到可用:ping -c)
echo $?的输出为0,$?的作用是什么?
- 判断条件真假
- 判断命令是否正确执行
$? -eq 1 为真
$? -eq 0 为假
4)case语句
case $变量名 in
"值 1“)
程序
;;
"值 2“)
程序
;;
............
*)
程序
;;
esac
5)for循环
第一种写法:
for 变量 in 值1 值2.....
do
程序
done
#! bin/bash
for i in "$*"
do
echo "num is $i"
第二种写法:
for (( 初始值;循环控制条件;))
do
程序
done
#! bin/bash
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
6)while循环
while [ 条件判断式 ]
do
程序
done
#! bin/bash
SUM=0
i=0
while [ $i -le 2 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum=$SUM"
7)函数
[ function ] funcname[()}
{
Action;
[return 值;]
}
调用 funcname [值]
#! bin/bash
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
#! bin/bash
function getSum(){
SUM=$[$a+$b]
echo "sum=$SUM"
read -p "请输入第一个数a" a
read -p "请输入第二个数b" b
# 调用getSum
getSum $a $b
5、其他一些命令
查看ip:
ifconfig
修改静态ip:
vim /etc/sysconfig/network-scripts/ifcfg-etho
# 修改:
onboot=yes
bootproto=static
# 添加:
IPADDR=172.20.1.100
NETMASK=255.255.255.0
GETEWAY=172.20.1.1
临时修改,即时生效,重启后失效
ifconfig eth0 172.20.1.120 netmask 255.255.255.0
修改网络配置文件,重启后生效:
1)系统重启
shutdown -r now
reboot
系统关闭:
shutdown -h now
halt
poweroff
2)网络重启
systemctl restart network
systemctl stop network
systemctl start network
3)网卡重启
ifconfig eth0 down
ifconfig eth0 up
ifdown eth0
ifup eth0