linux计算机基础之engineer DAY02
Posted mrmeng123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux计算机基础之engineer DAY02相关的知识,希望对你有一定的参考价值。
Shell脚本
脚本:一个可以运行的文件,可实现某种功能
案例1:第一个Shell脚本
[[email protected] ~]# vim /root/hello.sh
echo hello world
[[email protected] ~]# chmod +x /root/hello.sh #赋予执行权限
[[email protected] ~]# /root/hello.sh #绝对路径执行
规范Shell脚本的一般组成
? #! 环境声明(以下所有代码,有什么程序执行翻译)
? # 注释文本
? 可执行代码
? #! 环境声明(以下所有代码,有什么程序执行翻译)
? # 注释文本
? 可执行代码
案例1:第一个Shell脚本
[[email protected] ~]# cat /root/hello.sh
#!/bin/bash
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2
[[email protected] ~]# cat /root/hello.sh
#!/bin/bash
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2
[[email protected] ~]# chmod +x /root/hello.sh
[[email protected] ~]# /root/hello.sh #绝对路径执行
重定向输出
> :只收集前面命令正确输出结果
2> :只收集前面命令错误输出结果
&> :收集前面命令,正确与错误输出结果
2> :只收集前面命令错误输出结果
&> :收集前面命令,正确与错误输出结果
]# echo 123 > /opt/1.txt
]# cat /opt/1.txt
]# cat /opt/a
]# cat /opt/1.txt /opt/a
]# cat /opt/1.txt
]# cat /opt/a
]# cat /opt/1.txt /opt/a
]# cat /opt/1.txt /opt/a > /mnt/nsd.txt
]# cat /mnt/nsd.txt
]# cat /mnt/nsd.txt
]# cat /opt/1.txt /opt/a 2> /mnt/nsd.txt
]# cat /mnt/nsd.txt
]# cat /mnt/nsd.txt
]# cat /opt/1.txt /opt/a &> /mnt/nsd.txt
]# cat /mnt/nsd.txt
]# cat /mnt/nsd.txt
###############################################
案例3:书写一个可以创建用户的脚本
案例3:书写一个可以创建用户的脚本
/dev/null:黑洞设备
[[email protected] ~]# vim /root/user.sh
#!/bin/bash
useradd nsd04 &> /dev/null
echo 用户nsd04创建成功
echo 123 | passwd --stdin nsd04 &> /dev/null
echo 用户nsd04密码设置成功
#!/bin/bash
useradd nsd04 &> /dev/null
echo 用户nsd04创建成功
echo 123 | passwd --stdin nsd04 &> /dev/null
echo 用户nsd04密码设置成功
[[email protected] ~]# /root/user.sh
为了增加脚本灵活性,以及适应多变的需求所以使用变量
变量:会变化的量 类似于容器,以不变的名称,存储可以变化的值
– 方便以固定名称重复使用某个值
变量名=值
– 方便以固定名称重复使用某个值
变量名=值
[[email protected] ~]# vim /root/user.sh
#!/bin/bash
a=zhangsan #定义变量a储存值zhangsan
useradd $a &> /dev/null #$a使用变量a储存的值
echo 用户$a创建成功
echo 123 | passwd --stdin $a &> /dev/null
echo 用户$a密码设置成功
#!/bin/bash
a=zhangsan #定义变量a储存值zhangsan
useradd $a &> /dev/null #$a使用变量a储存的值
echo 用户$a创建成功
echo 123 | passwd --stdin $a &> /dev/null
echo 用户$a密码设置成功
[[email protected] ~]# /root/user.sh
定义/赋值变量
? 设置变量时的注意事项
– 等号两边不要有空格
– 变量名只能由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
– 若指定的变量名已存在,相当于为此变量重新赋值
? 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}
[[email protected] ~]# a=rhel
[[email protected] ~]# echo $a
rhel
[[email protected] ~]# echo ${a}
rhel
[[email protected] ~]# echo $a7
[[email protected] ~]# echo $a
rhel
[[email protected] ~]# echo ${a}
rhel
[[email protected] ~]# echo $a7
[[email protected] ~]# echo ${a}7
rhel7
[[email protected] ~]#
############################################
‘ ‘:取消所有特殊意义字符,变为普通字符
rhel7
[[email protected] ~]#
############################################
‘ ‘:取消所有特殊意义字符,变为普通字符
$( ) 或 反撇号 ` ` : 将命令的输出,作为参数直接参与下一条命令
[[email protected] ~]# rm -rf /opt/*
[[email protected] ~]# date +%F
[[email protected] opt]# cd /opt
[[email protected] opt]# mkdir `date +%F`
[[email protected] opt]# ls
[[email protected] ~]# date +%F
[[email protected] opt]# cd /opt
[[email protected] opt]# mkdir `date +%F`
[[email protected] opt]# ls
[[email protected] opt]# mkdir `hostname`
[[email protected] opt]# ls
[[email protected] opt]# mkdir nsd-$(date +%F)
[[email protected] opt]# ls
[[email protected] opt]# ls
[[email protected] opt]# mkdir nsd-$(date +%F)
[[email protected] opt]# ls
################################################
环境变量:变量名一般都大写,由系统定义完成,并且赋值完成
环境变量:变量名一般都大写,由系统定义完成,并且赋值完成
USER=当前登陆系统的用户名
[[email protected] /]# echo $USER
root
[[email protected] /]# su - nsd01
[[email protected] ~]$ echo $USER
nsd01
[[email protected] ~]$ exit
logout
[[email protected] /]# su - student
[[email protected] ~]$ echo $USER
student
[[email protected] ~]$ exit
logout
[[email protected] /]#
[[email protected] /]# echo $USER
root
[[email protected] /]# su - nsd01
[[email protected] ~]$ echo $USER
nsd01
[[email protected] ~]$ exit
logout
[[email protected] /]# su - student
[[email protected] ~]$ echo $USER
student
[[email protected] ~]$ exit
logout
[[email protected] /]#
位置变量:由系统定义完成,并且赋值完成
? 在执行脚本时,提供的命令行参数
– 表示为 $n,n为序号
– $1、$2、.. .. ${10}、${11}、.. ..
[[email protected] /]# vim /root/user.sh
#!/bin/bash
useradd $1 &> /dev/null
echo 用户$1创建成功
echo 123 | passwd --stdin $1 &> /dev/null
echo 用户$1密码设置成功
[[email protected] /]# /root/user.sh zhangsan
[[email protected] /]# /root/user.sh tom
[[email protected] /]# /root/user.sh harry
[[email protected] /]# vim /root/1.sh
#!/bin/bash
cat -n $1 | head -$2
echo 显示$1文件的头$2行
[[email protected] /]# /root/1.sh /etc/passwd 4
################################################
让用户体验更好,降低脚本使用难度,让脚本运行产生交互
read :
1.产生交互,会等待用户输入内容
2.记录用户在键盘上的输入
3.将用户在键盘上的输入,赋值给变量储存
1.产生交互,会等待用户输入内容
2.记录用户在键盘上的输入
3.将用户在键盘上的输入,赋值给变量储存
-p ‘屏幕输出信息‘
[[email protected] /]# vim /root/user.sh
#!/bin/bash
read -p ‘请输入您要创建的用户名:‘ a
useradd $a &> /dev/null
echo 用户$a创建成功
echo 123 | passwd --stdin $a &> /dev/null
echo 用户$a密码设置成功
[[email protected] /]#
#!/bin/bash
read -p ‘请输入您要创建的用户名:‘ a
useradd $a &> /dev/null
echo 用户$a创建成功
echo 123 | passwd --stdin $a &> /dev/null
echo 用户$a密码设置成功
[[email protected] /]#
#################################################
预定义变量:由系统定义完成,并且赋值完成
预定义变量:由系统定义完成,并且赋值完成
$# 已加载的位置变量的个数(统计一共输入多少个位置变量)
$* 输出所有位置变量的值
$* 输出所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常
[[email protected] /]# cat /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $# 统计一共输入了多少个位置变量的值
echo $* 输出所有位置变量的值
#!/bin/bash
echo $1
echo $2
echo $3
echo $# 统计一共输入了多少个位置变量的值
echo $* 输出所有位置变量的值
[[email protected] /]# /root/2.sh
[[email protected] /]# /root/2.sh dc tc dz tz
[[email protected] /]# useradd natasha
[[email protected] /]# echo $? #为0代表上条命令成功
[[email protected] /]# useradd natasha
[[email protected] /]# echo $? #非0值代表上条命令失败
[[email protected] /]# echo $? #为0代表上条命令成功
[[email protected] /]# useradd natasha
[[email protected] /]# echo $? #非0值代表上条命令失败
[[email protected] /]# id natasha
uid=1016(natasha) gid=1016(natasha) 组=1016(natasha)
[[email protected] /]# echo $? #为0代表上条命令成功
0
[[email protected] /]# id hahaxixi
id: hahaxixi: no such user
[[email protected] /]# echo $? #非0值代表上条命令失败
1
uid=1016(natasha) gid=1016(natasha) 组=1016(natasha)
[[email protected] /]# echo $? #为0代表上条命令成功
0
[[email protected] /]# id hahaxixi
id: hahaxixi: no such user
[[email protected] /]# echo $? #非0值代表上条命令失败
1
#################################################
条件测试及选择
条件测试及选择
[ 测试表达式 ] 每一部分之间都要有空格
-r:文档存在,且对文档具备读取权限为真
-w:文档存在,且对文档具备写权限为真
-x:文档存在,且对文档具备执行权限为真
? 检查文件状态
-e:文档存在为真
-d:文档存在,且为目录为真
-f:文档存在,且为文件为真
-w:文档存在,且对文档具备写权限为真
-x:文档存在,且对文档具备执行权限为真
? 检查文件状态
-e:文档存在为真
-d:文档存在,且为目录为真
-f:文档存在,且为文件为真
[[email protected] /]# [ -f /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -f /etc/ ]
[[email protected] /]# echo $?
[[email protected] /]# echo $?
[[email protected] /]# [ -f /etc/ ]
[[email protected] /]# echo $?
[[email protected] /]# [ -d /etc/passwd ]
[[email protected] /]# echo $?
[[email protected] /]# [ -d /etc/]
[[email protected] /]# echo $?
[[email protected] /]# echo $?
[[email protected] /]# [ -d /etc/]
[[email protected] /]# echo $?
? 比较整数大小
-gt:大于 #greater than
-ge:大于等于 greater equal
-gt:大于 #greater than
-ge:大于等于 greater equal
-eq:等于 equal
-ne:不等于 no equal
-le:小于等于 little equal
-lt:小于 little
[[email protected] /]# [ 1 -eq 1 ]
[[email protected] /]# echo $?
-ne:不等于 no equal
-le:小于等于 little equal
-lt:小于 little
[[email protected] /]# [ 1 -eq 1 ]
[[email protected] /]# echo $?
? 字符串比对
== :相等一致为真
!= :不相等为真
[[email protected] /]# [ student == root ]
[[email protected] /]# echo $?
1
[[email protected] /]# [ student != root ]
[[email protected] /]# echo $?
0
[[email protected] /]# [ $USER == root ]
[[email protected] /]# echo $?
0
[[email protected] /]#
#############################################
if双分支处理
if [条件测试];then
命令序列xx
else
命令序列yy
fi
命令序列xx
else
命令序列yy
fi
[[email protected] /]# vim /root/if01.sh
#!/bin/bash
if [ $1 -eq 2 ];then
echo hello
else
echo hi
fi
[[email protected] /]# /root/if01.sh 1
[[email protected] /]# /root/if01.sh 2
#!/bin/bash
if [ $1 -eq 2 ];then
echo hello
else
echo hi
fi
[[email protected] /]# /root/if01.sh 1
[[email protected] /]# /root/if01.sh 2
[[email protected] /]# cat /root/if02.sh
#!/bin/bash
if [ $# -eq 0 ];then
echo 您没有输入任何的命令行参数
else
echo 您输入了命令行参数
echo 您一共输入了$#个参数
echo 它们的值为$*
fi
#!/bin/bash
if [ $# -eq 0 ];then
echo 您没有输入任何的命令行参数
else
echo 您输入了命令行参数
echo 您一共输入了$#个参数
echo 它们的值为$*
fi
[[email protected] /]# /root/if02.sh
[[email protected] /]# /root/if02.sh dc tc dz tz
if多分支处理
if [条件测试1];then
命令序列xx
elif [条件测试2];then
命令序列yy
elif [条件测试3];then
命令序列aa
..........
else
命令序列zz
fi
命令序列xx
elif [条件测试2];then
命令序列yy
elif [条件测试3];then
命令序列aa
..........
else
命令序列zz
fi
案例:书写一个成绩脚本
用户输入考试成绩,利用 read -p 手法进行获得用户成绩
如果成绩 大于等于 90 ,则输出 优秀
如果成绩 大于等于 80 ,则输出 良好
如果成绩 大于等于 70 ,则输出 一般
如果成绩 大于等于 60 ,则输出 合格
如果以上条件均不满足,则输出 再牛的肖邦也弹不出哥的悲伤!
[[email protected] /]# vim /root/if04.sh
#!/bin/bash
read -p ‘请输入您的成绩:‘ num
if [ $num -ge 90 ];then
echo 优秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 一般
elif [ $num -ge 60 ];then
echo 合格
else
echo ‘再牛的肖邦,也弹不出哥的悲伤!‘
fi
[[email protected] /]# /root/if04.sh
#!/bin/bash
read -p ‘请输入您的成绩:‘ num
if [ $num -ge 90 ];then
echo 优秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 一般
elif [ $num -ge 60 ];then
echo 合格
else
echo ‘再牛的肖邦,也弹不出哥的悲伤!‘
fi
[[email protected] /]# /root/if04.sh
#########################################
for循环结构
for循环结构
for 变量名 in 值列表
do
命令序列
done
do
命令序列
done
[[email protected] /]# vim /root/for01.sh
#!/bin/bash
for a in zhangsan lisi wangwu dc tc dz tz
do
useradd $a &> /dev/null
echo $a创建成功
done
[[email protected] /]# /root/for01.sh
创建用户 nsd1~nsd50
造数工具: {起始点..结束点} {1..50}
[[email protected] /]# rm -rf /opt/*
[[email protected] /]# touch /opt/nsd{1..10}.txt
[[email protected] /]# ls /opt/
[[email protected] /]# touch /opt/nsd{1..10}.txt
[[email protected] /]# ls /opt/
[[email protected] /]# cat /root/for01.sh
#!/bin/bash
for a in {1..50}
do
useradd nsd$a &> /dev/null
echo nsd$a创建成功
done
[[email protected] /]#
#################################################
#!/bin/bash
for a in {1..50}
do
useradd nsd$a &> /dev/null
echo nsd$a创建成功
done
[[email protected] /]#
#################################################
案例:书写一个判断IP通信的脚本
用户输入IP地址,利用read -p 方式获得用户输入的IP地址
判断如果本机可以与该IP地址通信,则输出 可以通信
判断如果本机不可以与该IP地址通信,则输出 无法可以通信
判断如果本机可以与该IP地址通信,则输出 可以通信
判断如果本机不可以与该IP地址通信,则输出 无法可以通信
[[email protected] /]# vim /root/ip.sh
#!/bin/bash
read -p ‘请输入您要测试的IP地址:‘ ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo $ip可以通信
else
echo $ip无法通信
fi
[[email protected] /]#
#!/bin/bash
read -p ‘请输入您要测试的IP地址:‘ ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo $ip可以通信
else
echo $ip无法通信
fi
[[email protected] /]#
###########################################
以上是关于linux计算机基础之engineer DAY02的主要内容,如果未能解决你的问题,请参考以下文章