shell基础及变量
一 Shell概述
1.Shell的作用——命令解释器,“翻译官”
shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上。
2.Shell在Linux系统中的位置
二 Shell基础
1.历史命令——history
(1)命令
[root@www~]# history [-raw] histfiles
选项与参数:
n :数字,意思是『要列出最近的n 笔命令行表』的意思!
-c :将目前的shell 中的所有history 内容全部消除
-a :将目前新增的history 命令新增入histfiles中,若没有加histfiles,则默认写入~/.bash_history
-r :将histfiles的内容读到目前这个shell 的history 记忆中;
-w :将目前的history 记忆内容写入histfiles中
注意:历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
(2)历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
eg:
[root@localhost Ivy]# !24 <==运行第24 笔命令
[root@localhost Ivy]# !! <==运行上一个命令,本例中亦即!24
[root@localhost Ivy]# !al <==运行最近以al 为开头的命令
(3)历史命令的读取与记录
在正常的情况下,历史命令的读取与记录是这样的:
- 当我们以 bash 登陆 Linux 主机之后,系统会主动的由家目录的 ~/.bash_history 读取以前曾经下过的命令,那么 ~/.bash_history 会记录几笔数据呢?这就与你 bash 的 HISTFILESIZE 这个变量配置值有关了!
- 假设我这次登陆主机后,共下达过 100 次命令,『等我注销时, 系统就会将 101~1100 这总共 1000 笔历史命令升级到 ~/.bash_history 当中。』 也就是说,历史命令在我注销时,会将最近的 HISTFILESIZE 笔记录到我的纪录文件当中。
- 当然,也可以用 history -w 强制立刻写入的。
2.命令与文件补全——Tab
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全
3.命令别名——alias
设置别名
[root@localhost Ivy]# alias别名='原命令'
删除别名
[root@localhost ~]# unalias别名
eg:[root@localhost ~]# alias grep=‘grep--color=auto’(注意等号两边不能有空格)
注意:alias的作用仅在该次登入的操作,即输入一次alias后,这个修改只在当前的Shell生效。如果重新开启一个Shell,或者重新登录,则这些alias将无法使用。
alias永久化的方法:
<1>.若要每次登入就自动生效别名,则把别名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc
<2>.若要让每一位用户都生效别名,则把别名加在/etc/bashrc最后面,然后# source /etc/bashrc
4.多命令顺序执行
多命令执行符 | 格式 | 作用 |
; | 命令1;命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1&&命令2 |
逻辑与(短路原则) 命令1执行正确,命令2才执行 命令1执行不正确,命令2不执行 |
|| | 命令1||命令2 |
逻辑或(短路原则) 命令1执行不正确,命令2才执行 命令1执行正确,命令2不执行 |
eg:(相当于if-else语句)
ls test.sh && echo "good" || echo "not good“
ls test.sh>/dev/null&& echo "good" || echo "not good“
5.管道(命令1的正确输出作为命令2的操作对象)—— |
[root@localhost ~]# 命令1 | 命令2
(1)cut(切割)
将一段信息的某一段给他『切』出来,处理的信息是以『行』为单位
[root@localhost Ivy]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@localhost Ivy]# cut -c 字符区间<==用于排列整齐的信息
选项与参数:
-d :后面接分隔字符。与-f 一起使用;
-f :依据-d 的分隔字符将一段信息分割成为数段,用-f 取出第几段的意思;
-c :以字符(characters) 的单位取出固定字符区间;
eg:
[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
[root@www ~]# echo $PATH | cut -d ':' -f 5
# 以『 : 』作为分隔,因此会出现 /usr/local/bin
# 列出第 3 与第 5
[root@www ~]# echo $PATH | cut -d ':' -f 3,5
(2)grep(搜索)
[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色显示!
eg:
[root@www ~]# last | grep 'root' |cut -d ' ' -f1
# 在取出 root 之后,利用上个命令 cut 的处理,就可以仅取得第一栏!
(3)sort(排序)
[root@www ~]# sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
eg:
#以 : 来分隔的,以第三栏来排序
[root@www ~]# cat /etc/passwd | sort -t ':' -k 3
(4) uniq
用于报告或忽略文件中的重复行,一般与sort命令结合使用。
[root@www ~]# uniq [-ic]
选项与参数:
-i :忽略大小写字符的不同;
-c :进行计数
eg:
#使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq
#承上题,如果我还想要知道每个人的登陆总次数呢?
[root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c
(5)tee
用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
[root@www~]# tee [-a] file
选项与参数:
-a :以累加(append) 的方式,将数据加入file 当中!
eg:
[root@www~]# last | tee last.list| cut -d " " -f1
# 将last 的输出存一份到last.list文件中
[root@www~]# ls -l /home | tee ~/homefile| more
# 将ls 的数据存一份到~/homefile,同时屏幕也有输出信息
[root@www~]# ls -l / | tee -a ~/homefile| more
# 要注意!tee 后接的文件会被覆盖,若加上-a 这个选项则能将信息累加。
6.输出命令——echo
[root@localhost ~]# echo [选项] [输出内容]
选项:
-e :支持反斜线控制的字符转换
-n 不换行输出
-E 禁用反斜线转义解释(默认)
转义:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\插入\字符;
\nnn插入nnn(八进制)所代表的ASCII字符;
7.shell脚本
基本元素
(1)#!/bin/bash 必须的,指出shell的类型,写在第一行
(2)# 注释
(3)变量
(4)控制
运行Shell脚本方法
方法1:
# sh./datewho.sh
方法2:
# chmod+x datewho.sh
# ./datewho.sh
三 Shell中的变量和符号
1.本地变量
(1)命名规则:
①由字母、数字和下划线组成,但是不能以数字开头。
②在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
(2)变量赋值:
变量=值
注意!!!
①等号两边不可以有空格
②取值包含空格,必须用双引号括起来
③Shell变量可以用大小写字母,区分大小写
(3)变量引用
$变量名
${变量名}
(4)清除变量
unset 变量名
eg:
echo ${name}
unset name (注意:name前没有$)
(5)变量输出——echo
①双引号:可以有变量,echo时对变量进行替换,echo "${PATH}";可以出现转义字符,echo -e "asdn\nadadss"
②单引号:任何字符都会原样输出,单引号字符串中的变量是无效的,echo时不做变量替换,echo '${PATH}'
2.环境变量
用于所有用户进程(通常称为子进程)。登陆进程称为父进程,通过pstree可以查看
注意:
(1)环境变量可以在命令行中设置,但用户注销时这些值将丢失
(2)环境变量均为大写
(3)必须用export命令导出
设置环境变量
variable-name=value
export variable-name(环境变量名大写)
显示环境变量
env可以看到所有的环境变量
echo $环境变量名(显示一个变量)
清除环境变量
unset 环境变量名
3.内部变量
是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
部分内部变量:
$# ——传送给shell程序的位置参数的数量
$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)。0表示没有错误,其他任何值表明有错误。
$0——shell程序的名称
$*——调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数
$@“参数1参数2”…形式保存的参数
$n第n个参数
$$本程序的PID
4.符号
(1)注释符#
除了#!/bin/bash里的#特殊
(2)美元符$
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来
(3)单引号
被引起的字符全部做普通字符,即全部原样
echo ‘my $SHELL’
(4)双引号
引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
(5)倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
(6)反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
例4:
[yuqun@yuqun~]$echo “Filename is N0\$\*”
Filename is N0$*
注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。
(7)获取字符串长度
string="abcd"
echo ${#string} #输出4
(8)提取子字符串
以下实例从字符串第2 个字符开始截取4 个字符
string="runoobis a great site"
echo ${string:1:4} # 输出unoo