8.Shell基础
8.1.Shell概述
8.1.1.概述
1、Shell简述
Shell是一个命令的解释器,它为用户提供了一个向Linux内核发送衣求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2、Shell分类:
Bourne Shell:从1979年起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。
C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
Shell的2种主要语法 类型有Bourne和C,这2种语法彼此不兼容。Bourne家族主要包括:sh,ksh,Bash,psh,zsh;C家族主要包括:csh,tcsh
Linux中主要是指的Bash Shell
Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell
3、Linux支持的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.脚本执行方式
1、echo输出命令
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为数字0,nnn代表3位8进制数。 |
\xhh |
按照16进制ASCII码表输出字符。其中hh是2位16进制数。 |
退格键示例:
通过-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+U或Ctrl+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、expr或let数值运算工具
使用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 |
显示硬件体系结构,如i386,i686等 |
\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 ~]#
相关推荐
8. **IPython**:IPython不仅是一个增强的Python shell,还提供了交互式计算的许多功能,如内建的调试器、交互式展示和笔记本文档支持。 9. **Scikit-learn**:Scikit-learn是Python中最受欢迎的机器学习库,提供了...
【linux学习笔记-16】shell管道重定向程序的实现.doc 【linux学习笔记-1】使用GDB调试简单的用户程序.doc 【linux学习笔记-2】父子进程共享文件描述符.doc 【linux学习笔记-3】文件操作(stat,chmod,umask).doc ...
完成下载后,使用以下命令在Linux环境下进行解压: ```bash tar -xvf pig-0.17.0.tar ``` 这将在当前目录下创建一个名为 "pig-0.17.0" 的目录,包含所有必要的文件和资源。 二、环境变量配置 为了使系统能够识别...
【linux学习笔记-8】Linux进程相关系统调用(1) 【linux学习笔记-9】Linux进程相关系统调用(2) 【linux学习笔记-10】Linux进程相关系统调用(3) 【linux学习笔记-11】守护进程daemon 【linux学习笔记-12】守护...
本压缩包“SSH学习笔记--整理.rar”包含了一份精心整理的SSH学习资源,对于想要深入理解SSH的初学者或者开发者来说,是一份非常有价值的资料。 首先,我们来看“马士兵Struts2学习笔记2011.doc”。Struts2是一个...
1. **文档**:可能包括PDF格式的教程、笔记或手册,详细解释Linux的基础知识,如命令行操作、文件系统管理、权限控制等。 2. **脚本**:可能会有Bash脚本示例,用于演示如何编写简单的自动化任务,例如系统维护、...
- **IPython**: IPython是Python的一个增强型交互式shell,提供了更好的语法高亮、自动完成、内建文档等功能,也支持Jupyter Notebook。 通过使用Anaconda,用户可以轻松地搭建和管理数据科学项目所需的环境,快速...
- **Grunt Shell**: Grunt是Pig的交互式Shell,用户可以在这里直接输入Pig Latin语句并看到结果。 - **Pig Scripts**: 复杂的数据处理任务可以通过编写Pig脚本完成,这些脚本可以包含多个Pig Latin语句,并可以使用...
【Linux学习笔记】这篇超全总结涵盖了Linux操作系统的基础知识,特别是关于命令行的使用和快捷键,以及一些桌面环境下的快捷操作。以下是笔记中的主要内容: 1. **LINUX常用操作命令**: - `clear`:清空终端屏幕...
### Linux学习笔记—01 Linux操作基础 #### 1. Linux 基础命令与用法 在Linux操作系统中,掌握一系列的基础命令是非常重要的。这些命令可以帮助用户进行各种日常操作,比如文件管理、目录切换、文件查看等。下面将...
Linux学习笔记PDF文档.pdf是一个详尽的资源,旨在帮助初学者和有经验的用户深入理解Linux操作系统。Linux作为开源的类Unix系统,以其稳定、安全和可定制性在全球范围内广泛应用于服务器、桌面环境以及嵌入式设备。这...
总的来说,这份“Linux学习笔记-很不错适合linux入门者”涵盖了Linux基础的方方面面,无论是对操作系统有兴趣的个人,还是准备从事系统管理员、运维工程师、开发人员等职业的学习者,都能从中受益匪浅。通过系统学习...
linux运维学习笔记:企业Shell面试题总结-2
根据提供的文件信息,本文将总结其中的Linux运维学习笔记中提及的多个企业Shell面试题及其解决方案和知识点。 1. 批量生成随机字符文件名案例 该案例主要考察使用Shell脚本批量创建文件,并为每个文件赋予随机生成...
《兄弟连Linux教程1-16章学习笔记》是一份全面涵盖Linux基础知识的学习资料,特别适合初学者和希望快速提升Linux技能的人群。这个压缩包包含了一系列文本文件和辅助图片,旨在帮助用户深入理解Linux系统的基本操作和...
Linux基础篇总共包含8个章节,第1章到第8章学习内容分别包括:Linux快速入门、Linux发展及系统安装、CentOS Linux系统管理、Linux必备命令、Linux用户和组、Linux软件包管理、磁盘管理、Linux文件共享管理等。...
源代码是软件开发的基础,通过查看和修改源代码,开发者可以理解系统的内部工作原理,进行功能添加、错误修复或性能优化。 【标签】虽然没有提供具体的标签,但我们可以根据主题推测一些相关的关键词:开源、Linux...
8. **应用场景**:IPython和`ipython_genutils`在数据分析、机器学习、科学计算和教育中都有广泛应用。例如,通过IPython Notebook,用户可以创建包含代码、文本、图像的交互式文档,方便教学和分享。 总的来说,`...
Linux学习笔记涵盖了许多核心主题,帮助初学者逐步掌握这一开源操作系统。笔记的详细内容如下: ### 第一章:Linux简介及安装 1. **Linux介绍**:Linux是一种自由和开放源代码的操作系统,基于Unix,由全球各地的...
《IPython 1.2.1:Python编程的强力工具》 IPython是Python编程环境的一个强大增强...通过深入学习和使用这个版本,我们可以更好地理解Python的交互式环境,提高我们的编程效率,并为未来更新的版本打下坚实的基础。