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