shell基础及变量

时间:2023-03-08 23:06:56
shell基础及变量

一 Shell概述

1.Shell的作用——命令解释器,“翻译官”

shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上。

shell基础及变量

2.Shell在Linux系统中的位置

shell基础及变量

二 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 这个选项则能将信息累加。

shell基础及变量

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命令行解释执行,得到的结果取代整个倒引号括起来的部分。

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