LinuxShell脚本编程基础
Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果,下面我们会介绍Shell-Script的编写.
Echo 标准输出
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串,linux的echo命令,在shell编程中极为常用,在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用.
[root@localhost ~]# echo --help |
实例1: 输出一个红字,并且黄底的”hello world”
[root@localhost ~]# echo -e "\e[31;43m hello world \e[0m" |
实例2: 输出\a本身
[root@localhost ~]# echo -e "\\\a" |
Read 标准输入
read命令从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合,该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开.在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY.
[root@localhost ~]# read --help |
实例1: 通过Read命令读取一个值
[root@localhost ~]# read temp |
实例2: 通过read命令读取,并输出一段提示信息,且10秒等待输入时间
[root@localhost ~]# read -p "please input name" -t 10 temp |
小脚本:
|
Bash 变量
变量是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问,在指令式语言中,变量通常是可变的.
变量是 bash 环境中非常重要的一个东西,我们知道 Linux 是多人多任务的环境,每个人登陆系统都能取得一个 bash 每个人都能够使用 bash 下达 mail 这个命令来收受『自己』的邮件,问题是 bash 是如何得知你的邮件信箱是哪个文件?这就需要『变量』的帮助啦,所以你说变量重不重要呢? 下面我们将介绍重要的环境变量、变量的取用与配置等数据。
关于变量名定义
● 变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY.
● 如果只提供了一个变量名,则整个输入行赋予该变量.
● 如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值.
变量定义的规范
规范1: 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格
[root@localhost ~]# name=lyshark |
规范2: 在bash中变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型
[root@localhost ~]# x=10 |
规范3: 变量用等号连接值,等号左右两侧不能有空格
[root@localhost ~]# name=lyshark |
规范4: 变量的值如果有空格,需要使用单引号或双引号包括
1.双引号:下面输出一段 “hello world”
[root@localhost ~]# temp="hello world" |
2.\脱意字符:输出$name本身
[root@localhost ~]# name=lyshark |
3.反引号与双引号:输出结果相同
[root@localhost ~]# echo `date` |
4.单引号括起来的都是普通字符
[root@localhost ~]# echo '`date`' |
规范5: 变量叠加:如果需要增加变量的值,那么可以进行变量值的叠加
1.变量需要用双引号包含 “$变量名” 或用 ${变量名} 包含变量名,才可以实现叠加.
[root@localhost ~]# name=lyshark |
2.将命令结果赋值给一个变量,则需要使用反引号或$()包含命令.
[root@localhost ~]# ntp=`date` |
用户自定义变量
用户自定义变量是最常见的变量,由用户自由定义变量名和变量的值.
显示变量:set 显示系统中所有的变量(自定义变量,与系统变量等)
[root@localhost ~]# set |
变量调用:使用 $调用变量
[root@localhost ~]# name=lyshark |
变量删除:删除一个正在使用的变量
[root@localhost ~]# name=lyshark |
set -u:当执行时使用到未定义过的变量,则显示错误信息
[root@localhost ~]# echo $age |
set -x:调用命令执行前,会先把命令输出一次
[root@localhost ~]# set -x |
系统的环境变量
环境变量可以帮我们达到很多功能,包括家目录的变换、提示字符的显示、运行文件搜寻的路径等,那么既然环境变量有那么多的功能,我们可以利用两个命令来查阅分别是 env 与 export ,这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等.环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的.
[环境变量]:环境变量的设置
[root@localhost ~]# export AGE=22 |
⦁环境变量的查询与删除
解释:env和set的区别:set命令可以查看所有变量,而env命令只能查看环境变量。
[root@localhost ~]# export NAME="LyShark" |
[env变量]:实现所有环境变量查询
解释:env命令可以查询到所有的环境变量,可是还有一些变量虽然不是环境变量,却是和Bash操作接口相关的变量,这些变量也对我们的Bash操作终端起到了重要的作用。这些变量就只能用set命令来查看了。
[root@localhost ~]# env |
[PATH变量]:系统查找命令的路径
解释:PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。
[root@localhost ~]# echo $PATH |
[PS1变量]:命令提示符设置
解释:PS1是用来定义命令行的提示符的,可以安装我们自己的需求来定义自己 喜欢的提示符。PS1可以支持以下这些选项:
⦁ \d:显示日期,格式为“星期月日” |
想要使用这些必须先知道定义的规范,来看下官方的PS1
[root@localhost ~]# echo $PS1 |
定义ps1的值时需要注意单引号,否则不生效
[root@localhost ~]# PS1='[\u@\t \w]$' |
LANG 语系变量
LANG定义的是Linux 的主语系环境变量:
[root@localhost ~]#echo $LANG |
这是因为我们Linux安装时,选择的是英文安装,所以默认的主语系变量是“en_US.UTF-8”。那么Linux中到底支持多少语系呢?我们可以使用以下命令查询:
[root@localhost ~]#locale -a |more |
我们当前是什么语系可以用locale 直接查询:
[root@localhost ~]#locale |
这是当前系统语系,又是默认语系,有没有快晕倒的感觉。解释下吧,我们可以这样理解,默认语系是下次重启之后系统所使用的语系,而当前系统语系是当前系统使用的语系。如果系统重启,会从默认语系配置文件/etc/sysconfig/i18n中读出语系,然后赋予变量LANG让这个语系生效。也就是说,LANG定义的语系只对当前系统生效,要想永久生效就要修改/etc/sysconfig/i18n文件了。
说到这里,我们需要解释下Linux中文支持的问题。是不是我们只要定义了语系为中文语系,如zh_CN.UTF-8就可以正确显示中文了呢?这要分情况,如果我们是在图形界面中,或者是使用远程连接工具(如SecureCRT),只要正确设置了语系,那么是可以正确显示中文的。当然远程连接工具也要配置正确的语系环境,具体配置方式可以参考Linux系统安装章节。
那么如果是纯字符界面(本地终端tty1-tty6)是不能显示中文的,因为Linux的纯字符界面时不能显示中文这么复杂的编码的。如果我们非要在纯字符界面显示中文,那么只能安装中文插件,如zhcon等。
位置参数变量
解释:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的.
位置参数变量 | 作用 |
---|---|
$n | n代表数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上参数需要用大括号包含,如:${10}. |
$* | 这个变量代表命令行中的所有参数,$*把所有参数看成一个整体. |
$@ | 这个变量也代表命令行中所有参数,不过$@把每个参数区分对待. |
$# | 这个变量代表命令行中所有参数的个数. |
[root@localhost ~]# cat a.sh |
[root@localhost ~]# cat b.sh |
[root@localhost ~]# cat c.sh |
系统预定义变量
解释:预定义变量是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的.
预定义变量 | 作用 |
---|---|
$? | 最后一次执行命令的返回状态,正确返回0,错误返回非0 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
实例1: $?
判断上一条命令执行状态,成功返回0,失败返回非0
[root@localhost ~]# ls -l |
实例2: $$
返回自身进程号
[root@localhost ~]# cat d.sh |
实例3: $!
返回最后一个后台执行的命令进程ID号
[root@localhost ~]# cat e.sh |
Bash 数值与运算符
declare命令用于声明和显示已存在的shell变量,当不提供变量名参数时显示所有shell变量,declare命令若不带任何参数选项,则会显示所有shell变量及其值,declare的功能与typeset命令的功能是相同的.
[root@localhost ~]# declare --help |
声明整数型: 声明整数型并使用
[root@localhost ~]# declare -i temp #此处我们声明了temp变量为整数型 |
声明定义数组: 声明数组并定义元素,打印
[root@localhost ~]# declare -a name #声明name为数组 |
声明定义数组: 声明数组,并在声明时定义元素内容
[root@localhost ~]# declare -a num=(1 2 3 4 5) #声明num为数组,并在声明是赋值 |
定义初始化数组: 数组定义的多种方法(定义并初始化)
---------------------------------------------------------------------------------------------------- |
求数组长度: 求数组长度,和单个数组元素长度.
[root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark) #声明测试数组 |
声明实现算数: 通过声明实现,整数计算
[root@localhost ~]# x=10 |
声明环境变量: 通过declare声明环境变量,和export是同样的效果
[root@localhost ~]# declare -x NAMES="LyShark" |
设置只读变量: 设置只读变量,只能读取变量,无法改变其数值
[root@localhost ~]# declare -r test="hello world" |
expr 或 let 数值运算
expr命令是一款表达式计算工具,使用它完成表达式的求值操作.let命令是bash中用于计算的工具,提供常用运算符还提供了方幂运算符,在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0.否则,返回的状态值是1.
expr加法乘法运算: 使用expr完成一次加法和乘法运算,(需要注意的是,运算符两边必须要有空格,否则不会运算)
[root@localhost ~]# declare -i x=10 |
let加法乘法运算: 使用let完成一次加法与乘法运算,(此处并没有严格规定运算符两边的距离)
[root@localhost ~]# declare -i x=100 |
let ++ –: let实现数值每次递增或递减1,类似C语言中的 x++
[root@localhost ~]# declare -i num=1 |
let x+=y: let数值每次递增或递减x,类似C语言中的 x+=y
[root@localhost ~]# declare -i num=1 |
特殊格式运算: 使用”$((运算式))” 或 “$[运算式]” 格式进行算数运算
[root@localhost ~]# declare -i x=100 |
Shell 运算符优先级
运算符的优先级,就是当有多个运算符同时存在时,谁先进行数值计算,但是有时也是有特殊情况,下面分别解释一下吧.
按照表格的优先级是乘除优先于加减,但是由于加减被()调用所以,括号的优先级高于乘除.
[root@localhost ~]# declare -i temp |
取模运算和取余运算绝大部分是重叠的,但是一个是计算机术语,一个是数学概念,区别在于取模运算对负数处理不太一样.
[root@localhost ~]# declare -i temp |
逻辑与,只有两边同时为真,才会返回真.
[root@localhost ~]# declare -i temp |