-[TOC]
第一章 shell编程规范与变量————理论讲解
前言:
本次学习了解的是变量
语言分为两大类
1.强语言:定义变量的时候需要声明数据类型,一旦声明,就不可变 jave c语言
1整型 init 1 2 3 100
长整型 long
2浮点型 单精度 float 4字节
双精度 double 8字节
带小数点就是浮点型
3.string 字符串
char 字符 英文字母字符 a 占一个字节
中文汉字字符,男 占两个字节
而在java中,所有字符都占两个字节
4 boolean 布尔值 ture 和false
5 date 日期
int a=10; a
弱语言 :shell javascript python 不需要声明
a=10;
a=10.1;
给a赋予任意含义,都可以
html 标记语言 以标签形式存在,
<head><haed>
<img src="">
xml文件格式
json 键:值 key:value a:10;
shell 优点:
变量直接定义,不需要声明,没有面向对象思想,所有的语言编写犹如记流水账
数组 函数
首先要先把命令记熟,和语句
[root@localhost ~]# cat /etc/shells /bin/sh '/bin/bash' /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh [root@localhost ~]#
t@localhost ~]# vi frist.sh #!/bin/bash 'shell脚本固有格式' cd /boot/ pwd ls -lh vml* [root@localhost ~]# chmod 744 frist.sh [root@localhost ~]# ./frist.sh /boot -rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d -rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
;表示一句话的结束,可以使用分号同时使用两条命令
[root@localhost boot]# ls;who ‘命令用分号隔开可以同时执行两个命令’ config-3.10.0-693.el7.x86_64 efi grub grub2 initramfs-0-rescue-33c124456fa34c50a98483245dfea58d.img initramfs-3.10.0-693.el7.x86_64.img initrd-plymouth.img symvers-3.10.0-693.el7.x86_64.gz System.map-3.10.0-693.el7.x86_64 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d vmlinuz-3.10.0-693.el7.x86_64 root :0 2019-11-25 13:43 (:0) root pts/0 2019-11-25 17:06 (:0)
[root@localhost ~]# ./frist.sh
[root@localhost ~]# sh frist.sh /boot -rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d -rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64 [root@localhost ~]#
[root@localhost ~]# source frist.sh /boot -rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d -rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64 [root@localhost boot]#
./ 此方法的文件必须要有执行x权限
sh 执行 ,当前路径无变化
source 执行,当前路径有变化
[root@localhost ~]# vim frist.sh #!/bin/bash #this is my frist shell-script. cd /boot/ echo “当前的目录位于:” '输出友好提示信息' pwd echo “其中以vml开头的文件包括:” ls -lh vml* ~
echo 代表输出语句,输出字符串用双引号
[root@localhost ~]# ./frist.sh 当前的目录位于: /boot 其中以vml开头的文件包括: -rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d -rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
重定向符号可以用来写日志文件
[root@localhost ~]# chattr +i /etc/passwd '给账号文件加锁' [root@localhost ~]# lsattr /etc/passwd '查看已枷锁' ----i----------- /etc/passwd [root@localhost ~]# useradd zhaoyun '测试' useradd:无法打开 /etc/passwd '标准错误输出' [root@localhost ~]# useradd zhaoyun 2> err.txt '使用2>重定向' [root@localhost ~]# ls anaconda-ks.cfg frist.sh test.sh 模板 图片 下载 桌面 err.txt initial-setup-ks.cfg 公共 视频 文档 音乐 [root@localhost ~]# cat err.txt '查看' useradd:无法打开 /etc/passwd
'cmd1 | cmd2 [... | cmdn]
[root@localhost ~]# grep "bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash gsy:x:1000:1000:gsy:/home/gsy:/bin/bash [root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}' root /bin/bash gsy /bin/bash [root@localhost ~]#
正则表达式三剑客
grep egrep 老大 过滤关键字
sed 老二 按行读取
awk 老三 按列读取数据
awk -F 指定分隔符 如果不加-F,则默认分隔符为制表符或空格
'{print 打印 $1 第一个参数 $7 第七个参数}'
$1 $2 代表位置变量
[root@localhost ~]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 20G 7.6G 13G 38% / devtmpfs devtmpfs 977M 0 977M 0% /dev tmpfs tmpfs 993M 0 993M 0% /dev/shm tmpfs tmpfs 993M 9.0M 984M 1% /run tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup /dev/sda1 xfs 6.0G 161M 5.9G 3% /boot /dev/mapper/centos-home xfs 10G 37M 10G 1% /home tmpfs tmpfs 199M 20K 199M 1% /run/user/0 /dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64 [root@localhost ~]# df -Th | awk '{print $1,$2,$6}' 文件系统 类型 已用% /dev/mapper/centos-root xfs 38% devtmpfs devtmpfs 0% tmpfs tmpfs 0% tmpfs tmpfs 1% tmpfs tmpfs 0% /dev/sda1 xfs 3% /dev/mapper/centos-home xfs 1% tmpfs tmpfs 1% /dev/sr0 iso9660 100%
变量名以字幕或下划线开头,区分大小写,建议全大写
查看变量的值
[root@localhost ~]# addr=192.168.100.100 [root@localhost ~]# echo $addr 192.168.100.100 [root@localhost ~]# addr=10 [root@localhost ~]# echo $addr 10 [root@localhost ~]# num=$addr [root@localhost ~]# addr=20 [root@localhost ~]# echo $addr $num 20 10 [root@localhost ~]# product=puthon [root@localhost ~]# version=3.7 [root@localhost ~]# echo $product $version puthon 3.7 [root@localhost ~]# echo $product2.8 ’当变量名与数字连起来时,则不显示‘ .8 [root@localhost ~]# echo $product 2.8 puthon 2.8 [root@localhost ~]# [root@localhost ~]# echo ${product}2.8 '想要的出来的结果与数字连在一起,就需要用上{}符号' puthon2.8
=号是赋值符号,把右边的值赋予给左边的值
addr="192.168.100.100";
_abc="hello";
变量开头不可以以数字和汉字为开头,只可以为字母或者下划线
java的命名方法叫字下美人数骆驼
骆驼是骆驼命名法
输出时,要把变量前面加$符号
变量赋值相当于在内存中开辟了一个存储空间,把赋予的值放在空间内
[root@localhost ~]# ps aux |wc -l 204 [root@localhost ~]# num=`ps aux | wc -l` [root@localhost ~]# echo $num 203 [root@localhost ~]# abc=$(ps aux | wc -l) [root@localhost ~]# echo $abc 203
请输入你想管理的服务 如何管理你的服务(选项:start,status,stop)
[root@localhost ~]# vim demo.txt #!/bin/bash #this is test read -p "请输入一个整数:" score echo "你的成绩为$score" [root@localhost ~]# sh demo.txt 请输入一个整数:996 你的成绩为996 ~
从控制台的输入和输出
java的操作
export可以把变量定义为全局变量,这样的话,不管是切换bash环境,还是切换用户都可以使用该变量
[root@localhost ~]# echo $abc 203 [root@localhost ~]# bash [root@localhost ~]# echo $abc [root@localhost ~]# exit exit [root@localhost ~]# echo $abc 203 [root@localhost ~]# export $abc '只识别变量名' bash: export: `203': 不是有效的标识符 [root@localhost ~]# export abc [root@localhost ~]# bash [root@localhost ~]# echo $abc 203 [root@localhost ~]# exit exit [root@localhost ~]#
[root@localhost ~]# expr 3 + 2 5 [root@localhost ~]# expr 9 - 10 -1 [root@localhost ~]# expr 9 / 10 0 [root@localhost ~]# expr 10 / 9 1 [root@localhost ~]# expr 10 / 8 1 [root@localhost ~]# expr 6 / 3 2 [root@localhost ~]# exp 6 [root@localhost ~]# exp expr: 语法错误 [root@localhost ~]# expr 39 % 5 4 [root@localhost ~]# echo $(expr 3 + 3) 6 [root@localhost ~]# sum='expr 3 + 3' '单引号' [root@localhost ~]# echo $sum expr 3 + 3 [root@localhost ~]# sum=`expr 3 + 3` '反撇号' [root@localhost ~]# echo $sum 6
[root@localhost ~]# vim /etc/profile MAIL="/var/spool/mail/$USER" export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL [root@localhost ~]# echo $MAIL /var/spool/mail/root [root@localhost ~]# echo $HOSTNAME localhost.localdomain [root@localhost ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin [root@localhost ~]# PATH="$PATH:/root" [root@localhost ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/root
:加环境变量
表示为$n,n为1~9之间的数字
[root@localhost ~]# ./myprog.sh 'one' two three four five 'six' '$1,第一个位置参数' '$6,第六位置参数'
[root@localhost ~]# vim demo.sh sum=0 sum=`expr $1 + $2` echo "总和为$sum" echo "执行的脚本是$0" echo "参数的个数是$#" echo "详细内容是$*" cho "执行成功$?" [root@localhost ~]# sh demo.sh 70 80 总和为150 执行的脚本是demo.sh 参数的个数是2 详细内容是70 80 执行成功0
统计是$#,
除此之外还有$? 是否执行成功,成功是0,不成功是非0值
详细内容是$*
/dev/null 类似一个拥有无限容量的目录,所有不用的文件都可以放到里面,一旦放进去,无法找回,慎用
跟/dev/null类似的还有/dev/zero,一个拥有无限大的文件,两个都做测试使用
#!/bin/bash username=`whoami` percent=20 echo "====欢迎你, $username====" echo "以下分区使用率超过$percent%" df -Th | awk -v percent=$percent 'BEGIN {NR!=1} {if ($6 > percent){print $7"\t"$6} }' [root@localhost bash]# echo "/root/bash/welcome.sh" >> /root/.bashrc [root@localhost bash]# su - root Last login: Mon Nov 25 18:44:16 GMT 2019 on pts/2 ====欢迎你, root==== 以下分区使用率超过20% Mounted Use% / 25% /boot 33%
然后把这个脚本的绝对路径写入到~/.bashrc中即可
#!/bin/bash #this is zuoye systemctl stop firewall.sevrice setenforce 0 read -p "请输入你想管理的服务:" score read -p "如何管理你的服务(选项:start,status,stop)" scorea systemctl $scorea $score echo "systemctl $scorea $score"
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。