linux基础知识之shell编程基础
⼀、shell基础
1. 什么是shell?
Shell:英⽂翻译为“壳”。对,没错,它就是个“壳”,就像我们常见的鸡蛋⼀样,shell就是那层“壳”。
在我们的linux操作系统中,有内核和具体的硬件,内核(kernel)将所有硬件的实现隐藏起来,并由其(kernel)控制具体的硬件⼯作。但是,内核在整个系统中极其重要,我们不希望被随意的进⾏操作,于是我们就在内核上包裹⼀层“壳”,⽤户通过这层“壳”来与内核通信,并最终控制具体的硬件。
shell的功能只是提供⽤户操作系统的⼀个接⼝,应⽤程序通过shell来和kernel进⾏交互控制硬件,实现具体的功能。
⽽shell本⾝也是个应⽤程序,只是它被⽤来与内核(kernel)打交道。
shell的版本有很多,例如Bourne Shell(sh),C shell,kshell、zshell等等,在linux我们常⽤的就是bash(Bourne Again Shell),它是Bourne Shell(sh)的增强版。
2. 什么是shell脚本?
shell脚本是利⽤shell的功能所写的⼀个程序,这个程序是⽤纯⽂本⽂件,将⼀些shell的语法与指令写在⾥⾯,搭配正规表⽰法、管线命令与数据流重导向等功能,已达到我们想要的处理母的。
shell脚本有点类似于我们在windows下的批处理⽂件(.bat).
shell脚本是⼀种过程式的编程,解释运⾏,依赖于外部程序⽂件运⾏。它不同于其它编译型语⾔(c、c++,java等),它的源代码在运⾏时启动解释器,由解释器边解释变运⾏,⽽编译型语⾔是源代码经过编译器编译后的⼆进制可执⾏⽂件。
3. 如何运⾏shell脚本?
运⾏shell脚本有3种⽅式:
(1)给脚本添加可执⾏权限,直接运⾏⽂件
例如:chmod +x /PATH/TO/SCRIPT_FILE
(2)直接调⽤命令解释器执⾏程序
例如:bash /PATH/TO/SCRIPT_FILE
(3)使⽤source运⾏
source⼜被称为“点”命令,通常⽤于重新执⾏刚修改的初始化⽂件,使之⽴即⽣效。
source命令影响shell进程本⾝,在脚本执⾏过程中,⽆⼦进程的创建和消亡
注意:
①脚本中的空⽩⾏都被忽略
②脚本中,所有以#开头的⾏,都会被视作注释⾏⽽被忽略,即为注释⾏
③shell脚本的运⾏是通过运⾏⼀个⼦shell进程实现的。
4. bash的配置⽂件
shell进程中定义的命令别名或变量等,仅在当前shell进程中有效,⽆法在其他shell进程中发挥作⽤,如果我们想要这些变量或命令别名在其他shell进程中同样发挥作⽤,则我们需要修改bash的配置⽂件。
配置⽂件分为两类:
(1)profile类:为交互式登录的shell进程提供配置
全局:对所有⽤户都⽣效
/etc/profile
/etc/profile.d/*.sh
⽤户个⼈:仅对当前⽤户⽣效
~/.bash_profile
功⽤:
① ⽤于定义环境变量
② 运⾏命令或脚本
(2)bashrc类:为⾮交互式登录的shell进程提供配置
全局:对所有⽤户都⽣效
/etc/bashrc
⽤户个⼈:仅对当前⽤户⽣效
~/.bashrc
功⽤:
① 定义本地变量
② 定义命令别名:alias
注意:仅管理员可以修改全局配置⽂件
登录类型:
交互式登录shell进程:
直接通过某终端输⼊账号和密码后登录打开的shell进程;
使⽤su命令:su - username,或者使⽤su -| USERNAME执⾏的登录切换
读取配置⽂件顺序:
/etc/profile->/etc/profile.d/*->/.bashrc->/etc/bashrc
/.bash_profile->
⾮交互式登录shell进程:
su USERNAME执⾏的登录切换
图形界⾯下打开的终端
运⾏脚本
读取配置⽂件顺序:
~/.bashrc->/etc/bashrc->/etc/profile.d/*
命令⾏中定义的特性,例如变量和别名作⽤域为当前shell进程的⽣命周期
配置⽂件定义的特性,只对随后新启动的shell进程有效;
让通过配置⽂件定义的特性⽴即⽣效:
(1) 通过命令⾏重复定义⼀次
(2) 让shell进程重读配置⽂件
a. source /PAHT/FROM/CONF_FILE
b. . /PAHT/FROM/CONF_FILE
1. 定义1个对所有⽤户都⽣效的命令别名,例如:lftps=‘lftp 17
2.168.0.1/pub’
定义变量别名,且对所有⽤户有效,则更改/etc/bashrc⽂件
linux循环执行命令脚本[root@localhost etc]# vim bashrc
……
alias lftp='lftp 172.168.0.1/pub'
……
[root@localhost etc]# source bashrc //使其⽴即⽣效
[root@localhost etc]# alias //查看定义的命令别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias lftp='lftp 172.168.0.1/pub'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
2. 让所有⽤户登录时提⽰“Welcome to Linux World!”
在/etc/profile.d/⽬录下添加⼀个.sh⽂件
[root@localhost profile.d]# vim Welcome.sh
echo "Welcome to Linux World!"
保存退出
再重新登录⼀个⽤户
Xshell 6 (Build 0086)
Copyright (c) 2002 NetSarang Computer, Inc. All rights reserved.
Type `help' to learn how to use Xshell prompt.
[C:\~]$
Connecting to 127.0.0.
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Tue Apr 9 20:14:59 2019 from 10.0.2.2
Welcome to Linux World!
[gqh@localhost ~]$
⼆、shell编程
1. 基本格式
shell脚本是⼀个通过命令组合,搭配正则表达式、管道数据重流向等功能的⽂本⽂件,它有其固定的格式。基本格式:
脚本⽂件的第⼀⾏:顶格,给出解释器路径,⽤于指明解释执⾏当前脚本的解释器程序⽂件
常⽤的解释器:
#!/bin/sh
#!/bin/bash
#!/bin/python
#!/bin/bash
echo "This is a test shell script!"
运⾏结果如下:
[root@localhost test]# chmod a+x test_sh.sh //添加可执⾏权限
[root@localhost test]# ./test_sh.sh //第⼀种运⾏⽅式
This is a test shell script!
[root@localhost test]# bash test_sh.sh //第⼆种运⾏⽅式,使⽤解释器直接运⾏,⽆需添加可执⾏权限This is a test shell script!
[root@localhost test]# source test_sh.sh //第三种运⾏⽅式,⽆需添加可执⾏权限
This is a test shell script!
2. 基本语法
(1)变量
⽤于储存数据的⼀个名字就叫变量,实际上变量名指向⼀段内存空间。
变量名:变量名只能包含数字、字母和下划线,⽽且不能以数字开头
变量替换:把变量名出现的位置替换成其所指向的内存空间中数据
变量引⽤: $ {var_name},$ var_name
变量类型:bash把所有变量统统视作字符型
bash中的变量⽆需事先申明,相当于,把声明和赋值过程同时实现。
本地变量:作⽤域仅为当前shell进程
赋值:name=value
引⽤:$ {var_name},$ var_name
查看变量:set
撤销变量:unset name
环境变量:作⽤域为当前shell进程及其⼦进程
变量赋值:
①export name=value
或
name=value
export name
②declare -x name=value
或
name=value
decals -x name
-x:指定的变量会成为环境变量,可供shell以外的程序来使⽤;
-r:将变量设置为只读;
查看环境变量
①export
②declare -x
③print env或env
撤销环境变量:unset name
局部变量:作⽤域仅为某代码⽚段(函数上下⽂)
位置参数变量:当执⾏脚本的shell进程传递的参数
特殊变量:shell内置的有特殊公⽤的变量
(2)数组
语法格式:
array_name=(value1 … valuen),元素⽤“空格”隔开
或
array_name[0]=value1
array_name[1]=value2
array_name[2]=value3
读取数组:
${array_name[index]}
获取数组中的所有元素:
使⽤@ 或 * 可以获取数组中的所有元素
例如:
$ {array_name[*]
或
$ {array_name[@]}
获取数组的长度
使⽤#获取数组长度
例如:
${#array_name[*]}
或
${#array_name[@]}
(3)参数传递
在执⾏shell脚本时,我们可以向脚本传递参数,脚本内获取参数的格式为:$n,n表⽰数字:
$0表⽰脚本⽂件名;
$1为执⾏脚本的第⼀个参数
$2为执⾏脚本的第⼀个参数,以此类推
例如:
$ ./test.sh 1 2 3
Shell 传递参数实例!
执⾏的⽂件名:./test.sh
第⼀个参数为:1
第⼆个参数为:2
第三个参数为:3
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论