#1、vim编辑器 文本编辑 命令驱动 #2、用户权限管理 用户、用户组及其管理 文件权限 rwx su、sudo #3、系统信息 时间、日期 进程 磁盘使用情况、内存使用情况 #4、文本处理命令 --了解 cut wc awk #5、shell编程 操作访问操作系统内核
VIM、VI编辑器
VI编辑器是linux平台上最强悍的==文本编辑器==。主要是以==命令==来驱动执行。
最困难的就是命令的使用 区分3种工作模式
VIM是VI的增强版本,功能产不多。
3种工作模式
==命令模式==
直接使用vi打开文件进入的就是命令模式 在此模式下,所敲的按键都理解为命令 以命令驱动执行不同的功能 此模型下,不能自由进行文本编辑
==输入模式==(左下角insert标记)
编辑文本内容 需要从命令模式按下i进入输入模式 按下esc回到命令模式
==底线命令模式==
: 字母 通常用于文件的保存退出 :q 退出 :w 保存 :wq 保存退出 :wq! 强制保存退出
还可以在命令模式下输入:==shift+zz== 快速的保存退出。
打开、新建
vim 文件名 #1、如果编辑的文件不存在 此时就是新建文件 new file #2、如果文件存在,就打开文件 进入命令模式
异常模式处理
情况:编辑过程中 ,VIM闪退。导致底层会生成一个swap交换文件,里面记录着未保存的数据
现象:再次打开文件的时候,编辑器会询问你如何处理swap交换文件。
vim基本操作命令
光标的移动
cp /etc/profile ./ #1、方向键控制移动 #2、命令 hjkl移动 #3、翻页 pageup pagedown #4、行首(home 0) 行尾(end $) #5、跳到文件的最后一行 G #6、跳到文件的第一行 gg
复制粘贴
#复制 yy 复制当前行 nyy 复制当前行往下n行 #粘贴 p 当前行的下一行粘贴 P 当前行的上一行粘贴
搜索替换
#搜索 /待搜索的内容 回车进行搜索 搜索到的结果高亮显示 使用n跳转到下一个搜索到的内容 N跳转上一个 #清楚搜索匹配之后的高亮显示 :noh #替换 :2,4s/原内容/替换内容/gc 没有g的时候 替换每一行匹配的到的第一个 g表示替换这一行的所有匹配到的 c表示替换前给用户提示 #如果需要进行全局替换 所谓第一行到最后一行 :1,$s/原内容/替换内容/gc :%s/原内容/替换内容/gc hello tom hello allen hello allen tom mac apple hello allen apple hello apple spark allen hadoop spark allen allen
删除、撤销
#删除命令 dd 删除当前行 ndd 删除当前行往下n行 #撤销、反撤销 u 撤销上一步的操作 后悔药 ctrl+r 反撤销
如何进行插入模式、编辑模式?
在命令模式下面输入字母进入插入模式 # i 进入到编辑模式后,定位到当前光标前面 # o 进入到编辑模式后,在当前行的后面,添加一行空行
常见的组合命令 ==G+o==
打开文件之后 调整到最后一行 在下一行开始编辑
注意:在crt中,复制的内容单击鼠标右键可以进行粘贴,但是在==vim编辑器中,必须在输入模式下再进行粘贴,否则内容会有丢失的风险==。
vim可视模式( VISUAL )
功能:用于文本的选择
# v 基于字符选择的 # V 基于行选择的 # ctrl+v 基于文本块的选择
选择之后配合其他命令进行操作
扩展:notepad++ 文本编辑插件
功能:在windows平台联机编辑linux上的文件,保存之后,自动同步服务器上。
前提:notepad++ 升级到最新版本
安装插件:插件--->插件管理--->NppFTP
插件的配置
用户与权限
用户、用户组
#用户 user linux上可以创建不同的用户 不同用户具有不同的权限 权限最高的用户叫做root 超级管理员用户 可以通过root去管理其他用户及权限 #用户组 usergroup 多个用户组成一组 同一组的用户具有相同的权限
权限
读read r
写write w
执行execute x
权限的分配和管理
在linux上对应文件文件夹,划分3个归属
文件的拥有者 user 拥有者所在的用户组 group 其他用户组 others
如何去查看权限 ls -l
[root@node1 linux02]# ll total 8 -rw-r--r--. 1 root root 47 May 18 11:23 1.txt -rw-r--r-- 就是权限位 第一位 -文件 d文件夹 l链接 后面每3位一组 rw- u 读写 r-- g 读 r-- o 读
用户组、用户的管理
==必须是root用户才可以进行管理==。
#groupadd 组名 新增用户组 #cat /etc/group 查看当前系统已有组信息 itheima:x:1001:lisi,wangwu itheima组名 x 密码段 没有密码 1001 groupID gid 组编号 lisi,wangwu 归属该组的用户 #删除组 groupdel 组名 #修改文件归属的组 chgrp 组名 文件/目录名 针对文件夹加上-R可以实现递归修改
https://www.runoob.com/linux/linux-comm-useradd.html #创建用户 useradd -m -g 组 新建用户名 -m 创建用户的家目录 -g 组 指定用户属于哪个组 如果没有-g 自动创建一个和用户名相同的组名 #设置密码 [root@node1 linux02]# passwd allen Changing password for user allen. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. #删除用户 userdel -r 用户名 #查看用户信息 cat /etc/passwd | grep 用户名
SU、SUDO
su命令:用于用户之间的切换。
# su 用户 [allen@node1 ~]$ ll /root ls: cannot open directory /root: Permission denied [allen@node1 ~]$ su root #普通用户切换成为root需要输入root密码 Password: [root@node1 linux02]# su allen #root用户切换成为普通用户 不需要密码 [allen@node1 linux02]$ [allen@node1 linux02]$ exit #退出 exit #弊端:虽然通过切换可以具有root权限,但是root密码已经泄露了 不安全。 #能不能实现一种 让普通用户临时具有root权限,但是又不泄露密码
sudo
功能:给普通用户临时授予root权限。
注意:能够分配sudo的只有root。
sudo的配置命令 ==visudo==
sudo具体使用
step1:使用root用户编辑sudo配置文件
[root@node1 ~]# visudo ## Allow root to run any commands anywhere root ALL=(ALL) ALL allen ALL=(ALL) ALL allen ALL=(ALL) /usr/bin/ls #配置只允许执行指定的命令
step2:普通用户执行命令之前需要添加sudo关键字 申请sudo权限校验
[allen@node1 ~]$ ls /root ls: cannot open directory /root: Permission denied [allen@node1 ~]$ sudo ls /root We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for allen: #这里需要输入allen普通用户的密码 linux02 [allen@node1 ~]$ sudo ls /root #密码和sudo校验成功 获取一个为期5分钟的免密操作 linux02
修改文件的权限
核心的命令 chmod 权限 文件|文件夹 (针对文件夹-R 递归修改)
方式1:老百姓喜闻乐见的形式 ==数字==
read----->r 4 write---->w 2 execute-->x 1 没有权限 0 chmod 777 -R 文件|文件夹
方式2: ==字母 +-形式==
user->u group->g others->o all->a + 增加权限 - 减少权限 chmod o-x 1.txt chmod a-w 1.txt
方式3: ==等号赋值形式==
chmod u=rwx 1.txt
Linux系统命令
时间、日期
[root@node1 linux02]# date Tue May 18 14:44:13 CST 2021 [root@node1 linux02]# date +"%Y-%m-%d %H:%M:%S" 2021-05-18 14:44:53 [root@node1 linux02]# cal May 2021 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #关于时间日期的同步 后天学习 同步网络授时 #大数据都是集群环境 基本要求:集群的时间同步问题
查看磁盘、内存信息
df -h #disk free 显示磁盘剩余空间 [root@node1 linux02]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 12M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos-root 38G 1.5G 36G 5% / #重点关注这一行 /dev/sda1 1014M 152M 863M 15% /boot /dev/mapper/centos-home 19G 33M 19G 1% /home tmpfs 378M 0 378M 0% /run/user/0 tmpfs 378M 0 378M 0% /run/user/1000 #内存使用情况 [root@node1 linux02]# free -h total used free shared buff/cache available Mem: 3.7G 257M 3.0G 11M 467M 3.2G Swap: 3.9G 0B 3.9G
进程信息
#在安装了jdk的情况下 有一个命令专门用于查看本机运行的java进程。 jps #查看本机运行的所有进程 ps -ef | grep 进程名 #通常根据查询的进程号 结合kill -9 进程号 杀死进程
Linux文本处理命令
cut命令:根据条件从命令==结果中提取对应内容==
#案例:截取出 1.txt 文件中前2行的第5个字符 [root@node1 linux02]# cat 1.txt 111:aaa:bbb:ccc 222:ddd:eee:fff 333:ggg:hhh 444:iii [root@node1 linux02]# head -2 1.txt 111:aaa:bbb:ccc 222:ddd:eee:fff [root@node1 linux02]# head -2 1.txt | cut -c 4 #注意 从1开始计数的 : : [root@node1 linux02]# head -2 1.txt | cut -c 5 a d #案例:截取出 1.txt 文件中前2行以”:”进行分割的第1,2 段内容 [root@node1 linux02]# head -2 1.txt | cut -d ':' -f1,2 111:aaa 222:ddd [root@node1 linux02]# head -2 1.txt | cut -d ':' -f1-4 #范围1,2,3,4 111:aaa:bbb:ccc 222:ddd:eee:fff [root@node1 linux02]# head -2 1.txt | cut -d ':' -f1- #1到最后 111:aaa:bbb:ccc 222:ddd:eee:fff
wc命令:显示指定文件字节数, 单词数, 行数 信息。
[root@node1 linux02]# ll total 4 -rw-r--r--. 1 root root 52 May 18 15:02 1.txt [root@node1 linux02]# cat 1.txt 111:aaa:bbb:ccc 222:ddd:eee:fff 333:ggg:hhh 444:iii [root@node1 linux02]# wc 1.txt 4 4 52 1.txt 4表示行 4表示单词 以空格划分不同单词 52表示字节数
awk命令
awk是一门编程语言。
语法功能及其强大,这里介绍awk实现模糊查询、按需提取字段, 还可以进行判断和简单的运算等。
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
命令格式
awk [option] '{[pattern] action}' filenames #注意[]表示语法可选 option 表示可选参数 '{[pattern] action}' 表示根据什么规则匹配 执行什么动作 默认的动作叫做打印print [root@node1 linux02]# awk '{print}' score.txt zhangsan 68 99 26 lisi 98 66 96 wangwu 38 33 86 zhaoliu 78 44 36 maq 88 22 66 zhouba 98 44 46 #Q:怎么读取文件的? 整体读?还是一行一行读? 底层一行一行的读取数据 #Q:怎么输出的? 读取完一行内容之后 默认根据空格切割 一个字段一个字段返回
栗子
#提取指定字段的内容 如果字段之间以空格分隔 输出的内容就进行拼接 [root@node1 linux02]# awk '{print $1 $3}' score.txt zhangsan99 lisi66 wangwu33 zhaoliu44 maq22 zhouba44 [root@node1 linux02]# awk '{print $1,$3}' score.txt #如果字段之间以,分隔 输出的内容 #就以空格进行拼接 zhangsan 99 lisi 66 wangwu 33 zhaoliu 44 maq 22 zhouba 44 #指定读取数据切割分隔符 [root@node1 linux02]# awk -F ':' '{print $2,$4}' 2.txt allen 18 james 35 #指定输出的格式 allen--->18 james--->35 OFS="字符" output field separator 向外输出时的段分割字符串 [root@node1 linux02]# awk -F ':' ' {OFS="--->"}{print $2,$4}' 2.txt allen--->18 james--->35 #awk内置的函数 [root@node1 linux02]# awk -F ' ' '{print toupper($1)}' score.txt ZHANGSAN LISI WANGWU ZHAOLIU MAQ ZHOUBA #if语句判断 [root@node1 linux02]# awk -F ' ' '{if($4>=60) print $1 $4 "及格"; else print $1 $4 "不及格" }' score.txt zhangsan26不及格 lisi96及格 wangwu86及格 zhaoliu36不及格 maq66及格 zhouba46不及格
Shell编程
shell
指的是一种==程序==,往往是使用C语言开发,功能是访问操作系统内核获取操作系统信息。
指的是==shell脚本语言==,使用什么样的命令语法格式去控制shell程序访问内核。
通常情况下,所说shell编程指的shell脚本编程,==学习shell语法规则==。
shell编程开发
在哪里编写?
只要能进行文本编辑的地方都可以写 linux上常使用vim编辑器开发
需要编译?
不需要编译
如何执行?
需要语法解释器 不需要安装 Linux系统中集成了很多个同种类的shell解释器 [root@node1 linux02]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh
默认shell解释器 ==bash shell = shell==
因为很多linux发行版都以bash作为默认的解释器 所以说市面上大多数shell编程都是基于bash开展的 bash shell免费的。
shell的快速入门
shell脚本文件 后缀名没有要求 ==通常以.sh结尾 见名知意==
格式
#!/bin/bash echo 'hello shell' #第一行 指定解释器的路径
给脚本授予执行权限
chmod a+x hello.sh
执行shell脚本
绝对路径指定shell脚本
[root@node1 linux02]# /root/linux02/hello.sh hello shell
相对路径
[root@node1 linux02]# hello.sh #默认去系统环境变量中寻找 错误 -bash: hello.sh: command not found [root@node1 linux02]# ./hello.sh #从当前目录下找 hello shell
把shell脚本交给其他shell程序执行 比如sh
[root@node1 linux02]# sh hello.sh hello shell
探讨:后缀名 解释器 执行权限是必须的吗? 不是必须的
[root@node1 linux02]# vim bye.hs echo "bye bye" [root@node1 linux02]# sh bye.hs bye bye #文件不是sh结尾 没有授权 没有指定bash解释器路径 但是却可以执行 #此时这个文件是作为参数传递给sh来执行的 此时解释器是sh 只要保证文件中语法正确就可以执行
shell 命令、shell 脚本
都是属于shell的东西
shell命令倾向于交互式使用,适合逻辑简单场景
shell脚本适合复杂逻辑 理解结合函数、条件判断、流程控制 写出更加丰富的程序。
shell命令和shell脚本之间可以互相换行。
#编写shell脚本 执行脚本 [root@node1 linux02]# cat hello.sh #!/bin/bash echo 'hello shell' [root@node1 linux02]# sh hello.sh hello shell #以shell命令执行 [root@node1 linux02]# echo 'hello shell' hello shell
shell变量
语法格式
变量=值 #注意等号两边不能有空格 [root@node1 linux02]# name = allen -bash: name: command not found [root@node1 linux02]# name=allen
变量的使用
[root@node1 linux02]# name=allen [root@node1 linux02]# echo name name [root@node1 linux02]# echo $name allen [root@node1 linux02]# echo ${name} allen [root@node1 linux02]# echo $namewoon [root@node1 linux02]# echo ${name}woon allenwoon #建议提取变量的时候 使用{}标识变量的边界范围 #unset 删除变量 #readonly 只读变量 不能修改 相当于java中final修饰的 [root@node1 linux02]# name=allen [root@node1 linux02]# echo ${name} allen [root@node1 linux02]# name=james [root@node1 linux02]# echo ${name} james [root@node1 linux02]# readonly name=allen [root@node1 linux02]# echo ${name} allen [root@node1 linux02]# name=james -bash: name: readonly variable [root@node1 linux02]# unset name -bash: unset: name: cannot unset: readonly variable #只读变量不能够进行删除 只会随着生命周期结束而结束 #对应shell命令来说 生命周期就是窗口关闭 #对应shell脚本来说 生命周期就是shell执行结束
shell变量分类
==局部变量==
[root@node1 linux02]# cat a.sh #!/bin/bash aaa=itcast echo $aaa [root@node1 linux02]# cat b.sh #!/bin/bash echo $aaa [root@node1 linux02]# sh b.sh [root@node1 linux02]# sh a.sh itcast #定义在某个shell脚本中 只在该脚本中有效
==全局变量==(系统变量)
不管什么程序 什么窗口 都可以加载解析到的 比如在linux上配置JAVA_HOME=/export/server/jdk-1.8 环境变量文件/etc/profile
shell字符串使用
定义字符串
可以使用单引号 可以使用双引号 可以不使用引号
==推荐使用双引号 实现变量的提取==
[root@node1 linux02]# name=allen [root@node1 linux02]# echo $name allen [root@node1 linux02]# name1='allen1' [root@node1 linux02]# echo $name1 allen1 [root@node1 linux02]# name2="allen2" [root@node1 linux02]# echo $name2 allen2 [root@node1 linux02]# echo my name is ${name} my name is allen [root@node1 linux02]# echo 'my name is ${name}' my name is ${name} [root@node1 linux02]# echo "my name is ${name}" my name is allen
字符串的使用
#获取字符串的长度 [root@node1 linux02]# name=allen [root@node1 linux02]# echo ${name} allen [root@node1 linux02]# echo ${#name} 5 #提取子字符串 下标从0开始 [root@node1 linux02]# words="i like play basketball" [root@node1 linux02]# echo ${words:3} #从3开始到最后 ike play basketball [root@node1 linux02]# echo ${words:3,3} #注意不是以,分割 这种语法错误 ike play basketball [root@node1 linux02]# echo ${words:3:3} #从3开始截取3个 ike #查找子字符串
==反引号==
`
英文状态下输入ESC下面
功能:表示执行反引号的命令
#需求:把date命令执行的结果赋值给nowtime变量 [root@node1 linux02]# date Tue May 18 17:01:55 CST 2021 [root@node1 linux02]# nowtime=date #如果没有反引号 理解为字符串 [root@node1 linux02]# echo $nowtime date [root@node1 linux02]# nowtime=`date` #使用反引号 理解为执行命令 把命令的结果进行赋值 [root@node1 linux02]# echo $nowtime Tue May 18 17:02:41 CST 2021
shell程序传递
别名:动态传参
java中如何动态把参数传递到程序中去?
public static void main(String args[]){ args[0] ---> ..... } //如何执行java程序 java -jar xxxx.jar mainclass arg1 arg2 //arg1 arg2就是动态传入到程序内部的参数 内部由args数组接收
shell动态传参
#传递参数的方式 sh hello.sh 参数1,参数2,参数3... #shell脚本内部如何接收 #!/bin/bash echo "第一个参数为: $1"; echo "第三个参数为: $3"; echo "脚本的名称是: $0"; echo "参数个数为: $#"; echo "传递的参数作为一个字符串显示: $*"; [root@node1 linux02]# sh c.sh 第一个参数为: 第三个参数为: 脚本的名称是: c.sh 参数个数为: 0 传递的参数作为一个字符串显示: [root@node1 linux02]# sh c.sh 11 22 33 44 55 第一个参数为: 11 第三个参数为: 33 脚本的名称是: c.sh 参数个数为: 5 传递的参数作为一个字符串显示: 11 22 33 44 55
动态传参中 和@区别
#被" "包含时 "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串; "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表。 [root@node1 linux02]# vim d.sh #!/bin/bash echo "$*" echo "---------------" echo "$@" [root@node1 linux02]# sh d.sh 11 22 33 11 22 33 --------------- 11 22 33 #思考 如何确定是一个整体 各个独立的? 长度?循环次数?
shell运算符
Shell 和其他编程语音一样,支持包括:算术、关系、布尔、字符串等运算符。
==原生/bin/bash 不支持简单的数学运算==。可以借助其他工具命令来实现。
算术运算
[root@node1 linux02]# a=1+1 [root@node1 linux02]# echo $a 1+1 #方式1:expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 `expr 2 + 3` 使用expr的时候 运算符两边要有空格 [root@node1 linux02]# a=`expr 1+1` [root@node1 linux02]# echo $a 1+1 [root@node1 linux02]# a=`expr 1 + 1` [root@node1 linux02]# echo $a 2 #方式2:$[1+2] [root@node1 linux02]# a=$[2+3] [root@node1 linux02]# echo $a 5 #方式3:只能实现+1 -1操作 ((a++)) ((a--)) [root@node1 linux02]# a=1 [root@node1 linux02]# echo $a 1 [root@node1 linux02]# ((a++)) [root@node1 linux02]# echo $a 2 #栗子 #!/bin/bash a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val"
关系运算符
#关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 EQ 就是 EQUAL等于 NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL 大于等于 LE 就是 LESS THAN OR EQUAL 小于等 #!/bin/bash a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi
布尔运算符
!= 不等于 -a and -o or
流程控制
if..else ==在语句结束的时候反写if fi==
单if
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi #功能:判断ssh服务是否启动 #将上述的shell命令改写为shell脚本 [root@node1 linux02]# vim if.sh #!/bin/bash if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "ssh启动了" fi
if..else
嵌套if
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
for循环
方式1:
for N in 1 2 3; do echo $N; done 或 for N in {1..3}; do echo $N; done
方式2 :
for ((初始值; 限制值; 执行步长)) do 程序段 done
while循环
while [ expression ] do command … done
应用:模拟数据源实时不间断产生
while true;do date >>/root/itcast.txt;sleep 0.5;done
case匹配
echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
shell函数的使用
背景:shell不需要进行编译,解释器从上往下从左往右读取代码执行。
结论:在shell中先定义函数 再使用函数,==函数定义要放在使用之前==。
语法格式
[ function ] funname () { 程序段; [return int;] }
函数入门案例
[root@node1 ~]# vim f.sh #!/bin/bash #1、定义函数 sayhello () { echo "hello a" } echo "--------" #调用函数 sayhello "f.sh" [New] 11L, 103C written [root@node1 ~]# sh f.sh -------- hello a
调用函数的时候 动态传参 传递给函数内部
[root@node1 ~]# vim f1.sh #!/bin/bash #1、定义函数 sayhello () { echo $1 #在函数体内部使用符号接收传递参数 echo $2 } #调用函数并传递2个参数 sayhello 111 22
函数的返回值的使用
#!/bin/bash ###演示带返回值的参数 function getMax() { if [ $1 -lt $2 ]; then return $2 else return $1; fi } echo "Shell 程序中传递的两个参数是:$1 , $2" ##调用函数 getMax $1 $2 echo "最大值::$?" ##$?表示返回值 #首先执行shell脚本的时候 把外界的参数传递给shell脚本内部 作为内部变量 #在shell脚本内部调用函数 把内部变量作为参数传递给函数 函数内部接收到参数使用
数组使用
#数组定义 Shell数组用括号来表示,元素用"空格"符号分割开,语法格式如下: array_name=(value1 value2 value3 ... valuen) [root@node1 ~]# a1=(hadoop hive spark) #数组的取值 通过下标 从0开始 ${array_name[index]} [root@node1 ~]# echo ${a1[1]} hive [root@node1 ~]# echo ${a1[2]} spark #遍历数组 for for var in ${my_arr[*]} do echo $var done
source加载其他脚本
相当于java中import
在使用shell编写程序的 可以将通用的逻辑或者代码集中定义编写
在其他脚本中如果需要使用 source加载 解耦合
今日作业
1、复习今天课程知识 重点:vim编辑器使用 用户权限概念的理解 系统信息的查看 shell编程(编写简单脚本 看懂shell脚本) 2、练习linux-day02讲义的案例 尤其是shell脚本案例 测试$* $@区别 shell脚本实现对输入数字奇偶判断 (read命令) 3、预习linux-day03