Linux学习笔记-8. Shell基础

8.Shell基础

 

 

8.1.Shell概述

 

8.1.1.概述

 

1Shell简述

 

Shell是一个命令的解释器,它为用户提供了一个向Linux内核发送衣求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

 

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

 

 

2Shell分类:

Bourne Shell:从1979年起Unix就开始使用Bourne ShellBourne Shell的主文件名为sh

C ShellC Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。

 

Shell2种主要语法 类型有BourneC,这2种语法彼此不兼容。Bourne家族主要包括:sh,ksh,Bash,psh,zshC家族主要包括:csh,tcsh

 

Linux中主要是指的Bash Shell

 

BashBashsh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell

 

 

 

3Linux支持的Shell

 

在配置文件中存储的有:

/etc/shells

 

 

[root@localhost ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

[root@localhost ~]#

 

 

切换到其他Shell,及退出:

 

[root@localhost ~]# sh

sh-4.2# exit

exit

[root@localhost ~]#

 

 

 

 8.1.2.脚本执行方式

 

 

1echo输出命令

echo [选项] [输出内容]

 

-e 支持反斜杠控制的字符转换

 

如果输出的内容有空格,则需要用引号括起来。

如果所示带了感叹号,使用双引号时,执行失败了,因为感叹号有特殊含义,所以需要使用单引号,取消其特殊含义即可。

[root@localhost ~]# echo "Hello World!"

-bash: !": event not found

 [root@localhost ~]# echo 'Hello World!'

Hello World!

[root@localhost ~]#

 

 

控制符

使用

\\

输出\本身

\a

输出警告

\b

退格键,也就是向左删除键

\c

取消输出行末的换行符。和-n选项一致。

\e

ESCAPE键(ESC

\f

换页符

\n

换行符

\r

回车符

\t

制表符,也就是Tab

\v

垂直制表符

\0nnn

按照8进制ASCII码表输出字符。其中0为数字0nnn代表38进制数。

\xhh

按照16进制ASCII码表输出字符。其中hh216进制数。

 

 

退格键示例:

通过-e,使用b字符被删除了,所以没有输出

[root@localhost ~]# echo "abc"

abc

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

ac

[root@localhost ~]#

 

制表符与换行符:

[root@localhost ~]# echo -e "a\tb\tc\nd\te\tf"

a       b       c

d       e       f

[root@localhost ~]#

 

 

输出颜色:

 

echo -e "\e[1;32m abcd \e[0m"

 

其中\e[1; \e[0m 是输出颜色命令的格式,32m代表颜色,abcd是内容

代表的颜色

30m

黑色

31m

红色

32m

绿色

33m

黄色

34m

蓝色

35m

洋红

36m

青色

37m

白色

 

 

2、第一个脚本

 

文件:

vi hello.sh

 

代码内容:

#!/bin/bash

#The first program

 

echo -e 'Hello World!'

~

 

其中,#!/bin/bash这个是固定的,必须要有,而且也必须是这些内容,第一行必须是#!/bin/bash

 

 

3、脚本执行

 

赋予脚本执行权限

 

我们的hello.sh脚本文件,默认所有人都是没有执行权限的。

[root@localhost ~]# ll hello.sh

-rw-r--r--. 1 root root 55 May  5 11:16 hello.sh

 

 

root增加执行权限:

[root@localhost ~]# chmod 755 hello.sh

[root@localhost ~]# ll

total 8

-rw-------. 1 root root 1283 Apr 22 16:09 anaconda-ks.cfg

-rwxr-xr-x. 1 root root   55 May  5 11:16 hello.sh

 

绝对路径或者相对路径执行:

[root@localhost ~]# ./hello.sh

Hello World!

[root@localhost ~]# /root/hello.sh

Hello World!

[root@localhost ~]#

 

Bash命令执行,表示用Bash Shell来解释执行脚本:

[root@localhost ~]# bash hello.sh

Hello World!

[root@localhost ~]#

 

 

 

 

cat -A选项表示显示文件全部内容,包括换行符等信息。

cat –A filename

 

 

通常情况下,在Windows下编写的脚本放在Linux上去执行,此时有时候会报错,执行不了,通常包含关键字^M

通过cat –A命令可以查看到脚本的换行符为^M$,这个是Windows的换行符,Linux的换行符为$,所以在Linux执行脚本时,不识别换行符^M

 

可以通过Linux中的工具dos2unix去修改换行符

 

安装

yum install dos2unix

 

 

Windows格式转化为Linux格式:

命令语法:

dos2unix 文件名

 

[root@localhost ~]# dos2unix tetris.sh

dos2unix: converting file tetris.sh to Unix format ...

[root@localhost ~]#

 

 

Linux格式转化为Windows格式:

unix2dos 文件名

 

 

 

 

 

8.2.Bash基本功能

 

8.2.1.历史命令与命令补全

 

  

1、历史命令

hisotry [选项] [历史命令保存文件]

-c 清空历史命令

-w 把缓存中的历史命令写历史命令保存文件中,默认是~/.bash_history,就是家目录下的.bash_history文件

 

 

历史命令默认会保存1000条,可以在环境变量配置文件中/etc/profile进行修改。

 

HISTSIZE=1000

 

修改后,重新登录即可。

 

 

历史命令的调用

 

使用上、下箭头调用以前的历史命令

使用 !n 重复执行第n条历史命令

使用 !! 重复执行上一条命令

使用 !字符串 重复执行最后一条以该字符串开头的命令

 

 

 

 

 

2、命令与文件补全

 

Tab键自动补全

 

 

 

 8.2.2.别名与快捷键

 

 

  

1、 命令别名

 

自定义别名:

alias aliasname=’原名

 

alias 别名=’原命令

 

 

系统中已经存在的别名:

[root@localhost ~]# 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 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'

 

 

命令执行顺序:

a)   第1顺位执行用绝对路径或相对路径执行的命令

b)   2顺位执行别名

c)    3顺位执行Bash内部命令

d)  4顺位执行按照$PATH环境变量定义的目录查找顺序找到的第1个命令。

 

 

2、  让别名永久生效

vi /root/.bashrc

 

配置到家目录的.bashrc文件中即可

 

 

3、删除别名

unalias 别名

 

4、常用快捷键

 

快捷键

作用

Ctrl+A

把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用

Ctrl+E

把光标移动到命令行结尾

Ctrl+C

强制终止当前的命令

Ctrl+L

清屏,相当于clear命令

Ctrl+U

删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便。

Ctrl+K

删除或剪切光标之后的内容

Ctrl+Y

粘贴Ctrl+UCtrl+K剪切的内容

Ctrl+R

在历史命令中搜索,按下Ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。

Ctrl+D

退出当前登录终端

Ctrl+Z

暂停,并放入后台

Ctrl+S

暂停屏幕输出

Ctrl+Q

恢复屏幕输出

 

 

 

 8.2.3.输入输出重定向

 

 

  

1、标准输入输出设备

 

很早的时候,没有鼠标,所以标准输入输出设备没有鼠标。

 

设备

设备文件名

文件描述符

类型

键盘

/dev/stdin/

0

标准输入

显示器

/dev/stdout/

1

标准输出

显示器

/dev/stderr

2

标准错误输出

 

 

 

2、 输出重定向

 

标准输出本来应该是显示器的,如果要将输出保存到文件中,就是输出重定向。

 

设备

设备文件名

作用

标准输出重定向

命令 > 文件

以覆盖方式,把命令的正确输出输出到指定的文件或设备中

把错误输出先保存到 &1中,然后再保存到文件中

命令 >> 文件

以追加方式,把命令的正确输出输出到指定的文件或设备中

标准错误输出重定向

错误命令 2> 文件

以覆盖方式,把命令的错误输出输出到指定的文件或设备中

错误命令 2>> 文件

以追加方式,把命令的错误输出输出到指定的文件或设备中

正确输出和错误输出同时保存

命令 > 文件 2>&1

以覆盖方式,把正确输出和错误输出都保存到同一个文件当中

命令 >> 文件 2>&1

以追加方式,把正确输出和错误输出都保存到同一个文件当中

命令 &> 文件

以覆盖方式,把正确输出和错误输出都保存到同一个文件当中

命令 &>> 文件

以追加方式,把正确输出和错误输出都保存到同一个文件当中

命令 >> 文件1 2 >> 文件2

把正确的输出追加到文件1中,把错误输出追加到文件2

 

 

 

 



 

 

 

 

将所有输出丢弃

ls &>/dev/null

 

 

/dev/null 是一个特殊的设备,输出到其中数据被丢弃,类似垃圾回收站一样

 

 

3、输入重定向

 

统计命令:

wc [选项] [文件名]

         -c 统计字节数

         -w 统计单词数

         -l 统计行数

 

输入重定向用的不是很多,这里不做多的介绍,了解就行

 

 

A:以键盘输入内容做为标准输入

统计输入了8行,8个单词,31个字符,字符包括回车与换行。以Ctrl+D结束输入。

[root@localhost dev]# wc

safd

 

sdaf

sad

f

sadf

sda

fsd

f      8       8      31

[root@localhost dev]#

 

B:以文件内容做为标准输入

命令 < 文件

 

 

统计hello.sh文件中有4行,8个单词,55个字符。

[root@localhost ~]# wc hello.sh

 4  8 55 hello.sh

[root@localhost ~]#

 

 

 

8.2.4.多命令顺序执行与管道符

 

 

 

1、多命令顺序执行

 

多命令执行符

格式

作用

;

命令1 ; 命令2

多个命令顺序执行,命令之间没有任何逻辑联系

&&

命令1 && 命令2

逻辑与

当命令1正确执行,则命令2才会执行

当命令1执行不正确,则命令2不会执行

||

命令1 || 命令2

逻辑或

当命令1执行不正确,则命令2才会执行

当命令1正确执行,则命令不会执行

 

 

 

2、磁盘和文件复制命令

可以复制磁盘,分区文件系统等内容,可以理解为磁盘级的复制

语法格式:

dd if=输入文件 of=输出文件 bs=字节数 count=个数

 

if=输入文件 指定源文件或源设备

of=输出文件 指定目标文件或目标设备

bs=字节数 指定一次输入/输出多少字节,即这些字节看做一个数据块

count=个数 指定输入/输出多少个数据块

 

/dev/zero是特殊设备文件

/dev/zero复制到testfile,复制2014个,一次1K,总共1M数据

date;dd if=/dev/zero of=/root/testfile bs=1K count=1024;date

 

 

[root@localhost ~]# date;dd if=/dev/zero of=/root/testfile bs=1K count=1024;date

Sat May  5 13:49:27 CST 2018

1024+0 records in

1024+0 records out

1048576 bytes (1.0 MB) copied, 0.0010105 s, 1.0 GB/s

Sat May  5 13:49:27 CST 2018

[root@localhost ~]# ll -h testfile

-rw-r--r--. 1 root root 1.0M May  5 13:49 testfile

 

 

示例:

命令执行成功输出yes,执行失败输出no

命令 && echo yes || echo no

 

3、管道符

语法格式:

命令1 | 命令2

 

命令1的正确输出做为命令2的操作对象

 

more只能分屏显示文件内容,并不能分屏显示命令的输出内容,这里可以通过管道符来使用more命令分页显示:

ll -a /etc|more

 

 

grep –n 显示行号:

[root@localhost ~]# ll -a /etc|grep -n yum.conf

180:-rw-r--r--.  1 root root    972 Apr 29 20:40 yum.conf

 

 

 

 8.2.5.通配符与其他特殊符号

 

 

 

 

1、通配符

 

通配符

作用

?

匹配1个任意字符

*

匹配0个或任意多个任意字符,也就是可以匹配任何内容

[]

匹配中括号中任意1个字符。例如:[abc]代表一定匹配1个字符,或者是a,或者是b,或者是c

[-]

匹配中括号中任意1个字符,-代表一个范围。例如:[a-z]代表匹配1个小写字母

[^]

逻辑非,表示匹配不是中括号内的1个字符。例如:[^0-9]代表匹配1个不是数字的字符。

 

 

删除/tmp下的所有文件和所有目录

rm –rf /tmp/*

 

 

显示文件名以abc结尾,并且文件名只有4个字符的文件

ls ?abc

 

显示文件名以abc结尾的文件,

ls *abc

 

显示文件名以abc结尾,并且文件中有4个字符,且以数字开头。

ls [0-9]abc

 

显示文件名以abc结尾,并且文件中有4个字符,且不以数字开头。

ls [^0-9]abc

 

 

2、Bash中其他特殊符号

 

符号

作用

‘’

单引号。在单引号中所有的特殊符号,如$`(反引号)都没有特殊含义

“”

双引号。在双引号中特殊符号都没有特殊含义,但是$`\是例外,拥有调用变量值、引用命令、转义符的特殊含义。

``

反引号(ESC键下面那个键)。反引号括起来的内容是系统命令,在bash中会先执行它。和$()使用一样,不过推荐$(),因为反引号非常容易看错。

$()

和反引号使用一样,用来引用系统命令。

#

Shell脚本中,#开头的行代表注释

$

用于调用变更的值,如需要调用变量name的值时,需要用$name方式得到变更的值。

\

转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出$符号,而不当做是变量引用。

 

 

单引号与双引号区别:

[root@localhost dir1]# name=china

[root@localhost dir1]# echo $name

china

[root@localhost dir1]# echo '$name'

$name

[root@localhost dir1]# echo "$name"

china

[root@localhost dir1]#

 

 

反引号与$()的作用:

[root@localhost dir1]# name1=`date`

[root@localhost dir1]# echo $name1

Sat May 5 14:30:54 CST 2018

 [root@localhost dir1]# name2=$(date)

[root@localhost dir1]# echo $name2

Sat May 5 14:35:46 CST 2018

 

 

 

 

8.3.Bash变量

 

8.3.1.用户自定义变量

 

 

 

1、什么是变量

变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。 每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

2、  变量设置规则

a)    变量名称可以由字母、数字、下划线组成,但是不能以数字开头。如果变量名是2name,则是错误的。

b)     Bash中,变量的默认类型都是字符串弄,如果要进行数值运算,则必须指定变量类型为数值弄。

c)     变量用等号连接值,等号左右两侧不能有空格。

d)     变量的值如果有空格,需要使用单引号或双引号括起来。

e)   在变量的值中,可以使用\转义符。

f)    如果需要增加变量值,那么可以进行变量值的叠加。不过变量需要使用双引号包含”$变量名或用${变量名}包含。

g)   如果把命令的结果作为变量的值赋予变量,则需要使用反引号或$()包含命令。

h)   环境变更名建议大写,便于区分。

 

 

3、  变量分类

a)    用户自定义变量

b)    环境变量:这种变量中主要保存的是和系统操作环境相关的数据民。

c)  位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变更名不能自定义,变量作用是固定的。

d)   预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变更作用也是固定的。

 

 

4、本地变量(用户自定义变量)

a)    变量定义

name=”123”

b)   变量叠加

 

[root@localhost dir1]# name="123"

[root@localhost dir1]# echo $name

123

[root@localhost dir1]# name="$name"456

[root@localhost dir1]# echo $name

123456

[root@localhost dir1]# name=${name}789

[root@localhost dir1]# echo $name

123456789

c) 变量调用

echo $name

d)   变量查看

set

e)  变量删除

unset name

 

 

8.3.2.环境变量

 

 

 

1、 环境变量是什么

用户自定义变量只在当前的Shell中生效,故也称为本地变量,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。

2、设置环境变量

a)    申明变量

export 变量名=变量值

所有的子Shell都可以查看这个环境变量

 

 

打开子Shell,输入bash命令即可

[root@localhost dir1]# bash

 

如何查看是否是子Shell

需要使用pstree命令,pstree命令需要安装psmisc工具包

查看这一行,有几个bash就是几个shell

        ├─sshd───sshd───bash───bash───pstree

 

 

[root@localhost dir1]# bash

[root@localhost dir1]# pstree

systemd─┬─NetworkManager───2*[{NetworkManager}]

        ├─agetty

        ├─auditd───{auditd}

        ├─crond

        ├─dbus-daemon───{dbus-daemon}

        ├─firewalld───{firewalld}

        ├─hypervkvpd

        ├─hypervvssd

        ├─lvmetad

        ├─master─┬─pickup

                └─qmgr

        ├─polkitd───5*[{polkitd}]

        ├─rsyslogd───2*[{rsyslogd}]

        ├─sshd───sshd───bash───bash───pstree

        ├─systemd-journal

        ├─systemd-logind

        ├─systemd-udevd

                   └─tuned───4*[{tuned}]

 

如何退出子Shell,输入exit命令即可:

[root@localhost dir1]# exit

exit

 

 

如下展示了子Shell可以访问父Shell的环境变量,然而子Shell定义的环境变量,父Shell是访问不到的。

[root@localhost dir1]# export myenv=testEnv

[root@localhost dir1]# bash

 [root@localhost dir1]# echo $myenv

testEnv

[root@localhost dir1]# exit

exit

 

 

b)   查询环境变量

env

c)   删除变量

unset 变量名

 

 

3、系统常见环境变量

a) PATH:系统查找命令的路径, 以逗号分隔

[root@localhost dir1]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

b)   PATH变量叠加,临时生效

[root@localhost dir1]# PATH="$PATH":/root/sh

[root@localhost dir1]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh

[root@localhost dir1]#

 

4、PS1:定义系统提示符的变量

 

符号

作用

\d

显示日期,格式为:星期

\h

显示简写主机名。如默认主机名为localhost

\t

显示24小时制时间,格式为:HH:MM:SS

\T

显示12小时制时间,格式为:HH:MM:SS

\A

显示24小时制时间,格式为:HH:MM

\u

显示当前用户名

\w

显示当前所在目录的完整名称

\W

显示当前所在目录的最后一个目录

\#

执行的第几个命令

\$

提示符。如果是root用户会显示提示符为#,如果变通用户则为$

 

 

[root@localhost ~]# echo $PS1

[\u@\h \W]\$

[root@localhost ~]#

 

改成小写w

[root@localhost sh]#PS1='[\u@\h \w]\$'

[root@localhost ~/sh]#ls

 

 

8.3.3.位置参数变量

 

 

1、位置参数变量

 

位置参数变量

作用

$n

n为数字,$0代表命令本身,$1-$9代表第1到第9个参数,十以上的参数需要使用大括号包含,如${10}

$*

这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。

$@

这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待。

$#

这个变量代表命令行中所有参数的个数。

 

 

 

$0-$9参数的使用:

 

[root@localhost ~/sh]#vim args.sh

 

脚本内容:

#!/bin/bash

 

 

echo $0

echo $1

echo $2

echo $3

 

 

无参数和有参数的执行结果:

[root@localhost ~/sh]#chmod 755 args.sh

[root@localhost ~/sh]#./args.sh

./args.sh

 

 

 

[root@localhost ~/sh]#./args.sh  a1 a2 a3

./args.sh

a1

a2

a3

[root@localhost ~/sh]#

 

 

$*$@$#的使用

 

[root@localhost ~/sh]#vim args.sh

 

修改脚本内容:

#!/bin/bash

 

 

echo $#

echo $*

echo $@

 

无参数和有参数的执行结果:

[root@localhost ~/sh]#./args.sh

0

 

 

[root@localhost ~/sh]#./args.sh a1 a2 a3

3

a1 a2 a3

a1 a2 a3

[root@localhost ~/sh]#

 

 

 

 

2、$@$*的区别

 

 

修改脚本内容为:

 

#!/bin/bash

 

 

for i in "$*"

#$*中的所有的参数看成是一个整体,所以这个for循环只会循环一次

        do

                echo "The arg is:$i"

        done

 

x=1

 

for y in "$@"

#$@中的每个参数都成是独立的,所以$@中有几个参数,就会循环几次

 

        do

                echo "The param$x is:$y"

                x=$(($x+1))

        done

 

 

无参数和有参数的执行结果:

[root@localhost ~/sh]#./args.sh

The arg is:

[root@localhost ~/sh]#./args.sh a1 a2 a3

The arg is:a1 a2 a3

The param1 is:a1

The param2 is:a2

The param3 is:a3

 

 

8.3.4.预定义变量

 

位置参数变量就是预定义变量的一种。

 

1、预定义变量

 

预定义变量

作用

$?

最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来确定),则 证明上一个命令执行不正确。

$$

当前进程的进程号:PID

$!

后台运行的最后一个进程的进程号PID

 

 

 

 

 

$?示例:

 

[root@localhost ~/sh]#echo $?

0

[root@localhost ~/sh]#asd

-bash: asd: command not found

[root@localhost ~/sh]#echo $?

127

[root@localhost ~/sh]#

 

 

 

脚本内容:

 

[root@localhost sh]# cat pid.sh

#!/bin/bash

 

echo "The current process is $$"

#输出前进程的PID

#这个PID就是pid.sh这个脚本执行时,生成的进程的PID

 

find /root -name hello.sh &

#使用find命令在root 目录下查找hello.sh文件

#符号&的意思是把命令放入后台执行

 

echo "The last one deamon process is $!"

[root@localhost sh]#

                    

执行结果:

 

[root@localhost sh]# ./pid.sh

The current process is 4575

The last one deamon process is 4576

[root@localhost sh]# /root/sh/hello.sh

 

[root@localhost sh]#

 

 

2、接收键盘输入

语法:read [选项] [变量名]

 

-p 提示信息:在等待read输入时,输出提示信息

-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间

-n 字符数:read命令只接受指定的字符数,就会执行

-s:隐藏输入的数据,适用于机密信息的输入

 

 

示例:

 

脚本内容:

[root@localhost sh]# cat read.sh

#!/bin/bash

 

 

read -t 30 -p "please input your name:" name

#提示请输入姓名,并等待30秒,把用户输入保存到变量中

 

echo "Name is $name"

 

read -s -t 30 -p "please input you age:" age

#年龄是隐私,所以使用-s选项隐藏输入

 

echo -e "\n"

echo "Age is $age"

 

read -n 1 -t 30 -p "please select you gender[M/F]:" gender

#使用-n 1 选项只接收一个输入字符就行执行,都不用输入回车

 

echo -e "\n"

echo "Sex is $gender"

[root@localhost sh]#

 

 

执行结果:

 

[root@localhost sh]# ./read.sh

please input your name:acc

Name is acc

please input you age:

 

Age is 18

please select you gender[M/F]:M

 

Sex is M

[root@localhost sh]#

 

 

 

8.4.Bash运算符

 

8.4.1.数值运算与运算符

 

 

1、 declare 声明变量类型

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

 

-:给变量设定类型属性

+:取消变量的类型属性

-i:将变量声明为整数型integer

-x:将变量声明为环境变量

-p:显示指定变量的被声明的类型

 

 

2、 数值运算-方法1

 

[root@localhost sh]# aa=11

[root@localhost sh]# bb=22

[root@localhost sh]# declare -i c=$aa+$bb

[root@localhost sh]# echo $c

33

 

-p选项可以查看变量的类型:-i

[root@localhost sh]# declare -p c

declare -i c="33"

 

 

3、exprlet数值运算工具

 

 

使用expr来计算数值,注意+号前后要有空格,否则计算失败

[root@localhost sh]# dd=$(expr $aa+$bb)

[root@localhost sh]# echo $dd

11+22

[root@localhost sh]# dd=$(expr $aa + $bb)

[root@localhost sh]# echo dd

dd

[root@localhost sh]#

 

 

4、$((运算式)) $[运算式]

 

 

[root@localhost sh]# ff=$(($aa+$bb))

[root@localhost sh]# echo $ff

33

[root@localhost sh]# gg=$[$aa+$bb]

[root@localhost sh]# echo $gg

33

[root@localhost sh]#

 

5、运算符

 

当值越大,优先级越高

优先级

运算符

说明

13

-+

单目负,单目正

12

!~

逻辑非,按位取反或补码

11

*/%

乘,除,取模

10

+-

加,减

9

<<>>

按位左移,按位右移

8

< => =<>

小于等于,大于等于,小于,大于

7

==!=

等于,不等于

6

&

按位与

5

^

按位异或

4

|

按位或

3

&&

逻辑与

2

||

逻辑或

1

=+=-=*=/=%=&=^=|=<<=>>=

赋值,运算且赋值

 

 

 8.4.2.变量测试与内容替换

 

 

变量转换方式

变量y没有设置

变量y为空值

变量y设置值

说明

x=${y-新值}

x=新值

x为空

x=$y

类似于取y的值,新值是默认值

x=${y:-新值}

x=新值

x=新值

x=$y

y值为空时,也取默认值

x=${y+新值}

x为空

x=新值

x=新值

 

x=${y:+新值}

x为空

x为空

x=新值

 

x=${y=新值}

x=新值

y=新值

x为空

y值不变

x=$y

y值不变

 

x=${y:=新值}

x=新值

y=新值

x=新值

y=新值

x=$y

y值不变

 

x=${y?新值}

新值输出到标准错误输出(就是屏幕)

x为空

x=$y

 

x=${y:?新值}

新值输出到标准错误输出

新值输出到标准错误输出

x=$y

 

 

 

y不存在时:

[root@localhost sh]# unset y

[root@localhost sh]# x=${y-New}

[root@localhost sh]# echo $x

New

[root@localhost sh]#

 

 

y为空值:

[root@localhost sh]# y=""

[root@localhost sh]# x=${y-New}

[root@localhost sh]# echo $x

 

[root@localhost sh]#

 

 

y有值:

[root@localhost sh]# y="Old"

[root@localhost sh]# x=${y-New}

[root@localhost sh]# echo $x

Old

[root@localhost sh]#

 

 

 

8.5.环境变量配置文件

 

8.5.1.简介

1、 source命令

source 配置文件 . 配置文件

 

 

2、环境变量配置文件

a)      环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,例如:PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量

b)  /etc/profile

c)   /etc/profile.d/*.sh

d)   ~/.bash_profile

e)    ~/.bashrc

f)  /etc/bashrc

 

 

 

8.5.2.作用

 

 

1、环境变量加载顺序

 

 

 

2、/etc/profile作用

a)   USER变量

b)   LOGNAME变量

c)   MAIL变量

d)   PATH变量

e)   HOSTNAME变量

f)   HISTSIZE变量

g)   umask

h)  调用/etc/profile/*.sh文件

 

 

3、lang.sh

调用/etc/profile/*.sh文件过程当中,主要是指文件/etc/profile.d/lang.sh

lang.sh调用了/etc/sysconfig/i18n文件,其中记录着当前系统的语言环境

centos7居然没有这个i18n文件。。。

 

4、~/.bash_profile

5、~/.bashrc

6、/etc/bashrc

不需要登录密码的,才会调用这个环境变量的加载,并加载全部。登录的Shell只加载一部分,前面已经加载的不会再加载。

7、命令提示符

 

 

从环境变量的加载顺序可以看出,越是后面 加载的环境,优先级越高。后面加载的会覆盖前面已经加载的环境变量。

 

 

 

8.5.3.其他配置文件和登录信息

 

 

1、注销时生效的环境变量配置文件

~/.bash_logout

 

2、历史命令保存文件

~/.bash_history

3、Shell登录信息

本地终端欢迎信息:/etc/issue

 

最后写警告信息,不要写欢迎信息。

转义符

作用

\d

显示当前系统日期

\s

显示操作系统名称

\l

显示登录的终端号

\m

显示硬件体系结构,如i386i686

\n

显示主机名

\o

显示域名

\r

显示内核版本

\t

显示当前系统时间

\u

显示当前登录用户的序列号

 

以上只对本地登录有效

 

远程终端的欢迎信息:/etc/issue.net

           转义符在/etc/issue.net文件中不能使用,只能写纯文本信息。

           是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入Banner /etc/issue.net行才能显示,记得要重启SSH服务。默认是不生效的。

 

重新登录后,转义符没有被替换,直接打印出来了。

\S

Kernel \r on an \m

Last login: Sat May  5 21:36:01 2018 from 192.168.1.101

[root@localhost ~]#

 

 

以上配置还分开,比较麻烦。但是他们是登录前显示,下面这个是登录后才显示的。

本地和远程都有效的欢迎信息配置:

/etc/motd

不管本地,还是远程,都可以显示此欢迎信息

 

如下所示,hi字符是我们配置的内容,已经打印出来了:

 

\S

Kernel \r on an \m

Last login: Sat May  5 21:41:12 2018

hi,

[root@localhost ~]#

 

 

 

 

 

猜你喜欢

转载自wlcacc.iteye.com/blog/2422743
今日推荐