该系列文章只是本人的学习笔记,文章中的文字描述提取自《Linux鸟哥私房菜》《Linux运维之道》等书中的重点内容,化繁为简能够在工作中快速复习掌握重点,并不代表个人立场,但转载请加出处,并注明参考文献。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果,下面我们会介绍Shell-Script的编写.

Echo 标准输出

echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串,linux的echo命令,在shell编程中极为常用,在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用.

[root@localhost ~]# echo --help

语法格式:[ echo [选项] [输出内容] ]

        -e              #支持反斜线控制的字符转换
-n #取消输出后行尾的换行符号
-----------------------------------------------------------------------------------------
控制字符: \\ #输出\本身
\a #输出警告音
\b #退格键,也就是向左删除键
\c #取消输出行末的换行符,和"-n"选项一致
\e #ESCAPE键
\f #换页符
\n #换行符
\r #回车键
\t #制表符,也就是Tab键
\v #垂直制表符
\0nnn #按照八进制ASCII码输出字符,其中0为数字零,nnn是三位八进制数
\xhh #按照十六进制ASCII码表输出字符,其中hh是两位十六进制数
-----------------------------------------------------------------------------------------
特殊格式: \\ #输出\本身
"\e[1" #代表颜色输入开始
"\e[0m" #代表颜色输入结束
\e[0m #关闭所有属性
\e[1m #设置高亮度
\e[4m #下划线
\e[5m #闪烁
\e[7m #反显
\e[8m #消隐
\e[nA #光标上移n行
\e[nB #光标下移n行
\e[nC #光标右移n行
\e[nD #光标左移n行
\e[y;xH #设置光标位置
\e[2J #清屏
\e[K #清除从光标到行尾的内容
\e[s #保存光标位置
\e[u #恢复光标位置
\e[25l #隐藏光标
\e[25h #显示光标
-----------------------------------------------------------------------------------------
文字颜色和底纹颜色: 文字颜色代码:30=黑色,31=红色,32=绿色,33=黄色,34=蓝色,35=洋红,36=青色,37=白色,39=结束
底纹颜色代码:40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=洋红,46=青色,47=白色,49=结束
-----------------------------------------------------------------------------------------

实例1: 输出一个红字,并且黄底的"hello world"

[root@localhost ~]# echo -e "\e[31;43m hello world \e[0m"

hello world

实例2: 输出\a本身

[root@localhost ~]# echo -e "\\\a"

\a

Read 标准输入

read命令从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合,该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开.在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY.

[root@localhost ~]# read --help

语法格式:[ read [选项] [输出内容] ]

        -p              #"提示信息",指定读取值时的提示符
-t #指定读取值时等待的时间(秒),read等待的秒数
-n #指定最多能接收的字符数(达到即执行)
-s #隐藏输入信息

实例1: 通过Read命令读取一个值

[root@localhost ~]# read temp
hello Lyshark [root@localhost ~]# echo $temp
hello Lyshark

实例2: 通过read命令读取,并输出一段提示信息,且10秒等待输入时间

[root@localhost ~]# read -p "please input name" -t 10 temp
wangrui [root@localhost ~]# echo $temp
wangrui

小脚本:

#!/bin/bash

read -p "请输入你的名字:" name
echo $name read -t 30 -p "请在30秒内完成输入,输入你的年龄:" age
echo $age read -s -t 30 "隐藏输入您的性别(m/w):" sex
echo $sex

Bash 变量

变量是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问,在指令式语言中,变量通常是可变的.

变量是 bash 环境中非常重要的一个东西,我们知道 Linux 是多人多任务的环境,每个人登陆系统都能取得一个 bash 每个人都能够使用 bash 下达 mail 这个命令来收受『自己』的邮件,问题是 bash 是如何得知你的邮件信箱是哪个文件?这就需要『变量』的帮助啦,所以你说变量重不重要呢? 下面我们将介绍重要的环境变量、变量的取用与配置等数据。

关于变量名定义

● 变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY.

● 如果只提供了一个变量名,则整个输入行赋予该变量.

● 如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值.

◆变量定义的规范◆

规范1: 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格

[root@localhost ~]# name=lyshark
[root@localhost ~]# echo $name
lyshark [root@localhost ~]# 1name=lyshark
-bash: 1name=lyshark: command not found

规范2: 在bash中变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型

[root@localhost ~]# x=10
[root@localhost ~]# y=20
[root@localhost ~]# sum=$x+$y [root@localhost ~]# echo $sum
10+20

规范3: 变量用等号连接值,等号左右两侧不能有空格

[root@localhost ~]# name=lyshark
[root@localhost ~]# echo $name
lyshark [root@localhost ~]# name =lyshark
-bash: name: command not found [root@localhost ~]# name= lyshark
-bash: lyshark: command not found

规范4: 变量的值如果有空格,需要使用单引号或双引号包括

1.双引号:下面输出一段 "hello world"

[root@localhost ~]# temp="hello world"

[root@localhost ~]# echo $temp
hello world

2.\脱意字符:输出$name本身

[root@localhost ~]# name=lyshark

[root@localhost ~]# echo "$name"
lyshark [root@localhost ~]# echo "\$name"
$name

3.反引号与双引号:输出结果相同

[root@localhost ~]# echo `date`
Sun Sep 23 23:51:38 EDT 2018 [root@localhost ~]# echo "`date`"
Sun Sep 23 23:51:45 EDT 2018 [root@localhost ~]# echo "$(date)"
Sun Sep 23 23:51:52 EDT 2018 [root@localhost ~]# echo "\$(date)"
$(date)

4.单引号括起来的都是普通字符

[root@localhost ~]# echo '`date`'
`date`
[root@localhost ~]# echo '$name'
$name

规范5: 变量叠加:如果需要增加变量的值,那么可以进行变量值的叠加

1.变量需要用双引号包含 "$变量名" 或用 ${变量名} 包含变量名,才可以实现叠加.

[root@localhost ~]# name=lyshark
[root@localhost ~]# echo $name
lyshark [root@localhost ~]# temp="$name is"
[root@localhost ~]# echo $temp
lyshark is [root@localhost ~]# end="${temp} hack"
[root@localhost ~]# echo $end
lyshark is hack

2.将命令结果赋值给一个变量,则需要使用反引号或$()包含命令.

[root@localhost ~]# ntp=`date`
[root@localhost ~]# echo $ntp
Mon Sep 24 00:01:50 EDT 2018 [root@localhost ~]# temp=$(pwd)
[root@localhost ~]# echo $temp
/root

◆用户自定义变量◆

用户自定义变量是最常见的变量,由用户自由定义变量名和变量的值.

显示变量:set 显示系统中所有的变量(自定义变量,与系统变量等)

[root@localhost ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote...
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
....

变量调用:使用 $调用变量

[root@localhost ~]# name=lyshark

[root@localhost ~]# echo $name
....省略....

变量删除:删除一个正在使用的变量

[root@localhost ~]# name=lyshark
[root@localhost ~]# echo $name
lyshark [root@localhost ~]# unset name
[root@localhost ~]# echo $name

set -u:当执行时使用到未定义过的变量,则显示错误信息

[root@localhost ~]# echo $age

[root@localhost ~]# set -u

[root@localhost ~]# echo $age
-bash: age: unbound variable

set -x:调用命令执行前,会先把命令输出一次

[root@localhost ~]# set -x

[root@localhost ~]# ls -l /
+ ls --color=auto -l /
total 16
lrwxrwxrwx. 1 root root 7 Sep 18 09:05 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Sep 18 09:12 boot
....省略....

◆系统的环境变量◆

环境变量可以帮我们达到很多功能,包括家目录的变换、提示字符的显示、运行文件搜寻的路径等,那么既然环境变量有那么多的功能,我们可以利用两个命令来查阅分别是 env 与 export ,这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等.环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的.

[环境变量]:环境变量的设置

[root@localhost ~]# export AGE=22
[root@localhost ~]# echo $AGE
22

⦁环境变量的查询与删除

解释:env和set的区别:set命令可以查看所有变量,而env命令只能查看环境变量。

[root@localhost ~]# export NAME="LyShark"
[root@localhost ~]# env |grep NAME
NAME=LyShark
LOGNAME=root [root@localhost ~]# unset NAME
[root@localhost ~]# env |grep NAME
LOGNAME=root

[env变量]:实现所有环境变量查询

解释:env命令可以查询到所有的环境变量,可是还有一些变量虽然不是环境变量,却是和Bash操作接口相关的变量,这些变量也对我们的Bash操作终端起到了重要的作用。这些变量就只能用set命令来查看了。

[root@localhost ~]# env
XDG_SESSION_ID=4
HOSTNAME=localhost.localdomain
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
....省略.... [root@localhost ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
....省略....

[PATH变量]:系统查找命令的路径

解释:PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost ~]# ./wang.sh
hello world
[root@localhost ~]# PATH="$PATH":/root/wang.sh #命令的叠加 [root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/wang.sh

[PS1变量]:命令提示符设置

解释:PS1是用来定义命令行的提示符的,可以安装我们自己的需求来定义自己 喜欢的提示符。PS1可以支持以下这些选项:

⦁	\d:显示日期,格式为“星期月日”
⦁ \H:显示完整的主机名。如默认主机名“localhost.localdomain”
⦁ \h:显示简写主机名。如默认主机名“localhost”
⦁ \t:显示24小时制时间,格式为“HH:MM:SS”
⦁ \T:显示12小时制时间,格式为“HH:MM:SS”
⦁ \A:显示24小时制时间,格式为“HH:MM”
⦁ \@:显示12小时制时间,格式为“HH:MM am/pm”
⦁ \u:显示当前用户名
⦁ \v:显示Bash的版本信息
⦁ \w:显示当前所在目录的完整名称
⦁ \W:显示当前所在目录的最后一个目录
⦁ \#:执行的第几个命令
⦁ \$:提示符。如果是root提示符为“#”,如果是普通用户提示符为“$”

想要使用这些必须先知道定义的规范,来看下官方的PS1

[root@localhost ~]# echo $PS1

[\u@\h \W]\$

定义ps1的值时需要注意单引号,否则不生效

[root@localhost ~]# PS1='[\u@\t \w]$'
[root@00:49:09 ~]$
[root@00:49:10 ~]$ PS1='[\u@\h \W]\$'
[root@localhost ~]#

LANG 语系变量

LANG定义的是Linux 的主语系环境变量:

[root@localhost ~]#echo $LANG
en_US.UTF-8

这是因为我们Linux安装时,选择的是英文安装,所以默认的主语系变量是“en_US.UTF-8”。那么Linux中到底支持多少语系呢?我们可以使用以下命令查询:

[root@localhost ~]#locale -a |more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
aa_ER.utf8@saaho
aa_ET
aa_ET.utf8
....省略.... [root@localhost ~]#locale -a |wc -l
789

我们当前是什么语系可以用locale 直接查询:

[root@localhost ~]#locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
....省略....

这是当前系统语系,又是默认语系,有没有快晕倒的感觉。解释下吧,我们可以这样理解,默认语系是下次重启之后系统所使用的语系,而当前系统语系是当前系统使用的语系。如果系统重启,会从默认语系配置文件/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
#!/bin/bash echo -e "脚本名称:" $0
echo -e "参数1:" $1
echo -e "参数2: " $2
echo -e "参数3: " $3 [root@localhost ~]# bash a.sh a b c
脚本名称: a.sh
参数1: a
参数2: b
参数3: c
[root@localhost ~]# cat b.sh
#!/bin/bash echo $(($1$2$3)) [root@localhost ~]# bash b.sh 10+10
20
[root@localhost ~]# cat c.sh
#!/bin/bash echo -e "显示所有参数(作为一个整体显示): $*"
echo -e "显示所有参数(分页显示/分开接收): $@"
echo -e "显示参数个数: $#" [root@localhost ~]# bash c.sh A B C D
显示所有参数(作为一个整体显示): A B C D
显示所有参数(分页显示/分开接收): A B C D
显示参数个数: 4

◆系统预定义变量◆

解释:预定义变量是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的.

预定义变量 作用
$? 最后一次执行命令的返回状态,正确返回0,错误返回非0
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

实例1: $? 判断上一条命令执行状态,成功返回0,失败返回非0

[root@localhost ~]# ls -l
total 12
-rw-r--r-- 1 root root 112 Sep 24 01:25 a.sh
-rw-r--r-- 1 root root 30 Sep 24 01:26 b.sh
-rw-r--r-- 1 root root 165 Sep 24 01:29 c.sh [root@localhost ~]# echo $? ←上条执行成功返0
0 [root@localhost ~]# lss
-bash: lss: command not found [root@localhost ~]# echo $? ←上条执行失败返非0
127

实例2: $$ 返回自身进程号

[root@localhost ~]# cat d.sh
#!/bin/bash echo "本脚本的进程号是: $$" [root@localhost ~]# bash d.sh
本脚本的进程号是: 1540

实例3: $! 返回最后一个后台执行的命令进程ID号

[root@localhost ~]# cat e.sh
#!/bin/bash find / -name "*.log" & echo "最后一个后台执行的命令进程是: $!" [root@localhost ~]# bash e.sh
最后一个后台执行的命令进程是: 1546

Bash 数值与运算符

declare命令用于声明和显示已存在的shell变量,当不提供变量名参数时显示所有shell变量,declare命令若不带任何参数选项,则会显示所有shell变量及其值,declare的功能与typeset命令的功能是相同的.

[root@localhost ~]# declare --help

[语法格式]: declare [选项] [变量名]

            -           #给变量设定类型
+ #取消变量的类型
-a #将变量声明成数组
-i #将变量声明成整数型
-r #将变量声明成只读
-x #将变量声明成环境变量
-p #显示指定变量的类型及内容

声明整数型: 声明整数型并使用

[root@localhost ~]# declare -i temp   #此处我们声明了temp变量为整数型

[root@localhost ~]# temp=100          #赋值整形数据可打印
[root@localhost ~]# echo $temp
100 [root@localhost ~]# temp=a #赋值一个字符打印自动归0
[root@localhost ~]# echo $temp
0 [root@localhost ~]# unset temp #使用结束,撤销变量

声明定义数组: 声明数组并定义元素,打印

[root@localhost ~]# declare -a name           #声明name为数组

[root@localhost ~]# name[0]="hello world"     #给数组name[0]赋值
[root@localhost ~]# name[1]="hello lyshark" #给数组name[1]赋值 [root@localhost ~]# echo $name #默认打印name[0],因为下标从0开始
hello world [root@localhost ~]# name[2]="hello myblog" #给数组name[2]赋值 [root@localhost ~]# echo "${name[*]}" #打印数组全部元素 hello world hello lyshark hello myblog [root@localhost ~]# echo ${#name[*]} #统计数组元素个数
3
[root@localhost ~]# echo ${#name[@]} #统计数组元素个数
3 [root@localhost ~]# declare -p name #打印数组元素 declare -a name='([0]="hello world" [1]="hello lyshark" [2]="hello myblog")' [root@localhost ~]# unset name #使用结束,撤销数组

声明定义数组: 声明数组,并在声明时定义元素内容

[root@localhost ~]# declare -a num=(1 2 3 4 5)   #声明num为数组,并在声明是赋值

[root@localhost ~]# echo ${#num[*]}              #正确,一共有5个元素
5 [root@localhost ~]# declare -p num #分别打印数组中的元素 declare -a num='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
[root@localhost ~]# unset num #使用结束,撤销数组

定义初始化数组: 数组定义的多种方法(定义并初始化)

----------------------------------------------------------------------------------------------------
[方法1]
[root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark) #通过命令行一部到位
[root@localhost ~]# declare -p array_name #打印查看结果
declare -a array_name='([0]="Jerry" [1]="Alice" [2]="David" [3]="LyShark")'
----------------------------------------------------------------------------------------------------
[方法2]
[root@localhost ~]# declare -a array_name #先声明array_name数组
[root@localhost ~]# array_name=(Jerry Alice David LyShark) #紧接着打印
[root@localhost ~]# declare -p array_name
declare -a array_name='([0]="Jerry" [1]="Alice" [2]="David" [3]="LyShark")'
----------------------------------------------------------------------------------------------------
[方法3]
[root@localhost ~]# string="Jerry Alice Daid LyShark" #声明一个字符串
[root@localhost ~]# array_name=($string) #直接转换成数组
[root@localhost ~]# declare -p array_name
declare -a array_name='([0]="Jerry" [1]="Alice" [2]="Daid" [3]="LyShark")'
----------------------------------------------------------------------------------------------------
[方法4]
[root@localhost ~]# declare -a array_name #声明一个字符串
[root@localhost ~]# array_name=([0]="LyShark" [1]="Daid" [2]="Alice" [3]="Jerry") #直接转换成数组 [root@localhost ~]# echo ${array_name[@]} #查询数组元素
LyShark Daid Alice Jerry [root@localhost ~]# declare -p array_name #命令行查询
declare -a array_name='([0]="LyShark" [1]="Daid" [2]="Alice" [3]="Jerry")' [root@localhost ~]# unset array_name #使用结束,撤销数组
----------------------------------------------------------------------------------------------------

求数组长度: 求数组长度,和单个数组元素长度.

[root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark)            #声明测试数组
[root@localhost ~]# echo ${array_name[*]} #打印全部数组元素
Jerry Alice David LyShark [root@localhost ~]# echo ${#array_name[*]} #显示全部数组数
4
[root@localhost ~]# echo ${#array_name[@]} #显示全部数组数
4 [root@localhost ~]# echo ${#array_name[0]} #显示name[0]字符个数
5
[root@localhost ~]# echo ${#array_name[3]} #显示name[3]字符个数
7 [root@localhost ~]# unset array_name #使用结束,撤销数组

声明实现算数: 通过声明实现,整数计算

[root@localhost ~]# x=10
[root@localhost ~]# y=20
[root@localhost ~]#
[root@localhost ~]# declare -i temp=$x+$y
[root@localhost ~]#
[root@localhost ~]# echo $temp
30

声明环境变量: 通过declare声明环境变量,和export是同样的效果

[root@localhost ~]# declare -x NAMES="LyShark"
[root@localhost ~]# env |grep NAMES
NAMES=LyShark [root@localhost ~]# unset NAMES

设置只读变量: 设置只读变量,只能读取变量,无法改变其数值

[root@localhost ~]# declare -r test="hello world"
[root@localhost ~]# echo $test
hello world [root@localhost ~]# test=1234 #这里由于设置了只读属性,所以无法修改
-bash: test: readonly variable

expr 或 let 数值运算

expr命令是一款表达式计算工具,使用它完成表达式的求值操作.let命令是bash中用于计算的工具,提供常用运算符还提供了方幂运算符,在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0.否则,返回的状态值是1.

expr加法乘法运算: 使用expr完成一次加法和乘法运算,(需要注意的是,运算符两边必须要有空格,否则不会运算)

[root@localhost ~]# declare -i x=10
[root@localhost ~]# declare -i y=20 [root@localhost ~]# temp=$(expr $x + $y )
[root@localhost ~]# echo $temp
30 [root@localhost ~]# temp=$(expr $x * $y )
[root@localhost ~]# echo $temp
200

let加法乘法运算: 使用let完成一次加法与乘法运算,(此处并没有严格规定运算符两边的距离)

[root@localhost ~]# declare -i x=100
[root@localhost ~]# declare -i y=200 [root@localhost ~]# let temp=$x+$y
[root@localhost ~]# echo $temp
300 [root@localhost ~]# let temp=$x*$y
[root@localhost ~]# echo $temp
20000

let ++ --: let实现数值每次递增或递减1,类似C语言中的 x++

[root@localhost ~]# declare -i num=1

[root@localhost ~]# let num++
[root@localhost ~]# echo $num
2
[root@localhost ~]# let num++
[root@localhost ~]# echo $num
3
[root@localhost ~]# let num--
[root@localhost ~]# echo $num
2 [root@localhost ~]# let --num
[root@localhost ~]# echo $num
1

let x+=y: let数值每次递增或递减x,类似C语言中的 x+=y

[root@localhost ~]# declare -i num=1

[root@localhost ~]# let num+=1
[root@localhost ~]# echo $num
2
[root@localhost ~]# let num-=1
[root@localhost ~]# echo $num
1 [root@localhost ~]# let num+=10
[root@localhost ~]# echo $num
11

特殊格式运算: 使用"$((运算式))" 或 "$[运算式]" 格式进行算数运算

[root@localhost ~]# declare -i x=100
[root@localhost ~]# declare -i y=150 [root@localhost ~]# temp=$(( $x+$y ))
[root@localhost ~]# echo $temp
250 [root@localhost ~]# temp=$[ $x*$y ]
[root@localhost ~]# echo $temp
15000

Shell 运算符优先级

运算符的优先级,就是当有多个运算符同时存在时,谁先进行数值计算,但是有时也是有特殊情况,下面分别解释一下吧.

按照表格的优先级是乘除优先于加减,但是由于加减被()调用所以,括号的优先级高于乘除.

[root@localhost ~]# declare -i temp

[root@localhost ~]# temp=$(( (10+20)*2/4 ))
[root@localhost ~]# echo $temp
15

取模运算和取余运算绝大部分是重叠的,但是一个是计算机术语,一个是数学概念,区别在于取模运算对负数处理不太一样.

[root@localhost ~]# declare -i temp
[root@localhost ~]#
[root@localhost ~]# temp=$(( 14%3 ))
[root@localhost ~]# echo $temp
2
[root@localhost ~]# temp=$(( -14%3 ))
[root@localhost ~]# echo $temp
-2
[root@localhost ~]# temp=$(( -14%-3 ))
[root@localhost ~]# echo $temp
-2
[root@localhost ~]# temp=$(( 14%-3 ))
[root@localhost ~]# echo $temp
2
[root@localhost ~]# unset temp

逻辑与,只有两边同时为真,才会返回真.

[root@localhost ~]# declare -i temp
[root@localhost ~]#
[root@localhost ~]# temp=$(( 0 && 1 ))
[root@localhost ~]# echo $temp
0
[root@localhost ~]#
[root@localhost ~]# temp=$(( 1 && 1 ))
[root@localhost ~]# echo $temp
1

参考文献:Linux鸟哥私房菜,Linux运维之道

Linux Shell脚本编程基础(11)的更多相关文章

  1. Linux shell脚本编程基础之练习篇

    shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...

  2. Linux Shell脚本编程-基础1

    概述:  shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...

  3. Linux Shell脚本编程基础

    1. 脚本是一个包含一系列命令序列的文本文件,当运行这个脚本文件时,文件中包含的命令序列将得到执行. 2. 脚本主要由两部分组成:脚本解释器和命令序列 注:#!/bin/bash 指明脚本解释器为Ba ...

  4. Linux Shell脚本编程-基础2

    命令退出状态码  bash每个命令,执行状态都有返回值 0表示成功 非0表示失败(1-255) $?特殊变量可以打印出上一条命令的状态返回值 脚本的状态返回值是脚本执行的最后一条命令 自定义脚本状态返 ...

  5. linux基础—课堂随笔_03 SHELL脚本编程基础

    shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then条件为真的分 ...

  6. shell脚本编程基础介绍

    Linux系统——shell脚本编程基础介绍 1.什么是shell 它是一个命令解释器,在linux/unix操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种操作输出的结果 ...

  7. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  8. SHELL脚本编程基础知识

    SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...

  9. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

随机推荐

  1. SpringBoot定制修改Servlet容器

    1.如何修改Servlet容器的相关配置: 第一种:在application.properties中修改和server有关的配置(ServerProperties提供): server.port=80 ...

  2. Google Reader 快关了!!

    现在还每天用Google Reader, 每次打开都提示7月1号要关闭... 上图怀念: 控制区功能:排序.展开\收缩显示.上一条\下一条,还有下拉框下的很多功能... 列表显示 针对每个Item下的 ...

  3. JNI,RegisterNative参数解析

    Register native method - 数据类型和method descriptor 使用JNI时,为了使得虚拟机可以找到在C/C++ code中定义的native方法,有两种机制可以用,一 ...

  4. linux之网络

    一 什么是网络,网络能干什么 网络出现的主要目的就是实现主机和主机之间的通信,而互联网协议(Internet Protocol Suite)就是连接两台计算机之间的internet一系列统一的标准.互 ...

  5. 安装配置ftp服务器

    1.安装ftp服务 检查是否安装vsftpd rpm -qa|grep vsftpd 安装 vsftpd yum -y install vsftpd 2.配置 编辑 文件 /etc/vsftpd/vs ...

  6. java常用设计模式三:原型模式

    在说原型模式之前先说一下浅拷贝和深拷贝的概念 一.浅拷贝和深拷贝 1.浅拷贝 在java中,对象创建后需要有一个引用变量来指向该对象实际的地址空间,也就是说引用变量与对象实体是两个不同的数据体.在Ob ...

  7. windows下,将MySQL做成服务/脚本启动

    将mysql作为服务启动   假设数据库安装在:c:\Program Files\mysql 目录下 进入mysql的安装目录bin下 cd c:\Program Files\mysql\bin   ...

  8. wget批量下载http文件

    eg:http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeAwgDnaseUniform/ 下载该路径下的所有文件 wge ...

  9. 转:【衬线字体与无衬线字体】font-family之Serif和Sans-Serif

    CSS的font-family(字体系列)的值有许多,如Arial,Georgia,宋体,幼圆等. 一般可以分为两种,衬线字体(serif)和无衬线字体(sans-serif). 如果字体的笔画有末端 ...

  10. TypeError: 'MongoClient' object is not callable

    在声明数据库的时候,将中括号[ ]换成了圆括号() 错误: