[Linux] Shell (一):认识shell和shell变量

本文介绍了Shell的基本概念,包括Shell、bash及shell脚本的定义。详细解释了如何在Linux环境中使用bash进行变量操作,例如查看、定义、取消变量,以及如何使用环境变量。此外,还介绍了数组、字符串类型的变量声明。

什么是shell?

Shell,直译过来就是贝壳的意思。对于用户和系统内核来说,Shell就好比中间的一层“壳”,用户不能直接操作内核来作业,但可以通过可接收命令的程序执行命令来操作内核。这个接收并执行命令的程序就可以叫做shell了。

在维基百科中是这样解释的:一种壳层与命令行界面,是UNIX操作系统下传统的用户和计算机的交互界面。
普通意义上的shell就是可以接受用户输入命令的程序。它之所以被称作shell是因为它隐藏了操作系统低层的细节。同样的Unix下的图形用户界面GNOME和KDE,有时也被叫做“虚拟shell”或“图形shell”。

官方的定义: Shell是一个用户程序或为用户交互提供的环境。Shell是一个命令语言解释器,用于执行从标准输入设备(键盘)或文件读取的命令。Shell不是系统内核的一部分,但使用系统内核来执行程序,创建文件等。

常见的Shell

  • BASH ( Bourne-Again SHell ):Linux默认的shell.
  • TCSH:整合了CSH,提供了更多功能。
  • DASH:Debian基于bash进行了更改,比起bash更小,在ubuntu6.1开始默认使用
    dash,但后来由于测试出一些问题,现在ubuntu默认shell还是采用的bash。

查看Shell

系统的所有合法的shell都在/etc/shells文件中,系统变量SHELL则表示当前所采用的shell,可通过如下方式查看:

# 查找设备上所有的shell
$ cat /etc/shells
# 获取当前的shell
$ echo $SHELL

什么是bash?

bash,在上面已经解释过了,全称为Bourne-Again SHell,是UNIX上的一种shell,目前大多数Linux系统和Mac OS都将它作为默认shell。BASH shell有如下优点:

  • 命令记忆功能
    可以通过向上键查看上一次执行的命名,还可以通过history命令查看曾经执行的命令。
  • 命令自动补全功能
    使用TAB键可以进行命令补全、文件名补全。
  • 命令设置别名
    如果命令太长,则可以通过alias命令设置别名。
  • 作业控制、前台、后台控制
    可以将工作丢到后台去执行。
  • 命令支持通配符
    可以在命令中使用正则表达式。
  • Shell 脚本
    将连续执行的多个命令写入一个文件,执行该文件就可以执行所有的命令。

什么是shell script?

通常情况下,shell是交互式的,即shell接受用户指令,并执行它们,如果指令较多,一个一个执行他们太繁琐,这时可以将此命令序列存储到文本文件中,并通知shell执行此文本文件而不是输入命令。 这个文件就称为shell脚本。Shell脚本就是用纯文本文件编写的一系列命令。

接下来开始bash shell的学习。

shell 变量

1.查看变量

查看变量时,使用echo命令,该命令用于显示文本信息,因此可以用来读取变量,如:

# 显示变量的值
jyq@ubuntu:~$ echo ${PATH}
/home/jyq/bin:/home/jyq/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
jyq@ubuntu:~$ 

其中$表示是一个变量,{}方便解释器识别变量边界,当然也可以不使用,规范起见,应该使用{}将变量括起来。PATH是一个环境变量,定义了命令的查找路径。

2.自定义变量

如果想要自定义一个变量,使用等号=就可以设置bash变量:

# 第一次查看text变量时没有
$ echo $text
# 设置text变量
$ text=hello
# 再次查看text变量
$ echo $text
hello

但是在定义变量时需要注意以下几点:

  • 1.等号两边不能有空格,如果需要等号或特殊字符,可以使用单引号或者双引号引起来:
$ myname='hello shell!'
$ echo $myname
hello shell!
  • 2.变量名称只能是英文、数字和下划线,并且不能以数字开头;
  • 3.变量内容可以用单引号和双引号引起来,即shell 字符串,但两者含义不同:双引号会保留bash中特殊字符的特性,单引号则作为一般字符输出,如:
$ myfirstname=Kobe
$ myLastname=Bryant
$ name="${myfirstname} ${myLastname}"
$ echo $name
Kobe Bryant
$ name='$myfirstname $myLastname'
$ echo $name
$myfirstname $myLastname
  • 4.可以使用转义字符\将特殊字符进行转义;
  • 5.在命令中如果要使用命令,则使用反引号`command`或者$(command)的形式,如:
# 或者 dir=`ls -l`
$ dir=$(ls -l)
$ echo $dir
total 4 -rw-rw-r-- 1 jyq jyq 0 Jun 21 08:02 test1.txt -rwx------ 1 jyq jyq 32 Jun 21 07:52 test.sh
  • 6.如果要增加变量内容,可以使用"$var"或者${var},如:
$ content=hello
$ echo $content
hello
$ content=${content}" shell,"
$ echo $content
hello shell,
$ content="$content""nice to met you!"
$ echo $content
hello shell,nice to met you!
  • 7.如果该变量需要在bash子进程执行,则需要通过export来使变量变成环境变量,如:
export content

子进程通过bash开启,exit退出。

  • 8.通常大写的为系统默认变量,小写为用户设置变量。

3.取消变量

使用unset 变量名取消变量,如:

jyq@ubuntu:~$ echo ${name}
${firstname} ${lastname}
# 取消变量
jyq@ubuntu:~$ unset name
jyq@ubuntu:~$ echo ${name}
jyq@ubuntu:~$ 

4.evn命令和set命令查看变量

使用env命令可以查看所有的环境变量:

$ env
SHELL=/bin/bash
USER=jyq
PATH=/home/jyq/bin:/home/jyq/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LANG=en_US.UTF-8
HOME=/home/jyq
......

使用set命令查看所有的变量,包括环境变量和自定义变量。

5.export设置自定义变量为环境变量

自定义变量仅仅对当前的bash有效,如果在其他bash中,则会失效,可以通过如下步骤来测试:

# 定义一个变量myvar,并打印
jyq@ubuntu:~$ myvar="hello shell"
jyq@ubuntu:~$ echo $myvar
hello shell
# 开启一个子进程,打印无此变量
jyq@ubuntu:~$ bash
jyq@ubuntu:~$ echo $myvar

jyq@ubuntu:~$ 

在上述示例中,bash命令开启一个子进程,原来的父进程将会进入sleep状态。子进程会继承父进程的环境变量,但不会继承父进程的自定义变量,如果要使自定义变量能够在子进程中使用,则通过export命令将自定义变量转变为环境变量:

$ export myvar

在bash中,自定义变量也叫做局部变量,所以环境变量也称为全局变量。
$本身也是一个变量,代表当前bash的PID,如:

jyq@ubuntu:~$ echo $$
18320
jyq@ubuntu:~$ bash
jyq@ubuntu:~$ echo $$
18972
jyq@ubuntu:~$ 

6.read从键盘读取变量

使用read 命令从键盘中读取变量,使用 参数如下:

read [-pt] variable
-p    提示符
-t    等待时间,以秒为单位

如:

jyq@ubuntu:~$ read -p "Are you sure do this?" bagree
Are you sure do this?yes
jyq@ubuntu:~$ echo $bagree 
yes
jyq@ubuntu:~$ 

7.declare声明变量类型

bahs中默认变量类型为字符串类型,如果想要声明整数时,就需要使用declare,参数如下:

declare [-aixr] variable
-a    声明变量为数组
-i    声明变量为整数
-x    声明变量为环境变量,和export等效
-r    声明变量为readonly类型,即只读变量
-p    列出变量类型和值

如:

jyq@ubuntu:~$ sum=100+200+300
jyq@ubuntu:~$ echo $sum
100+200+300
# 变量默认为字符串,需要声明为整数
jyq@ubuntu:~$ declare -i sum=100+200+300
jyq@ubuntu:~$ echo $sum
600
jyq@ubuntu:~$ declare -r name=jyq
# 只读变量再次修改时,无法修改
jyq@ubuntu:~$ name=xxss
bash: name: readonly variable
jyq@ubuntu:~$ 

8.变量类型

shell 字符串

在前面说过,定义shell变量时=的两边不能出现空格,如果出现空格,需要使用双引号或者单引号括起来,就变成了shell字符串了,双引号会保留bash中特殊字符的特性,单引号则作为一般字符输出如:

jyq@ubuntu:~$ word1="hello shell,"
jyq@ubuntu:~$ word2="nice to meet you"
jyq@ubuntu:~$ str="${word1}${word2}"
jyq@ubuntu:~$ echo $str
hello shell,nice to meet you
jyq@ubuntu:~$ str2='${word1}${word2}'
jyq@ubuntu:~$ echo $str2
${word1}${word2}
jyq@ubuntu:~$ 
shell 数组

在shell中,使用arrayname=(value1 value2...)的形式来定义数组,每个值中间使用空格分隔,或者使用如下方式:

array_name=(
value0
value1
...
)

如:

# 定义数组
jyq@ubuntu:~$ number=(1 2 3 4 5 6)
jyq@ubuntu:~$ 

还有一种定义方式:单独定义数组的各个value:

$ number[1]=1100
$ number[7]=400

当要读取数组的值时,以${arrayname[index]}的形式:

# 读取数组
jyq@ubuntu:~$ echo ${number[5]}
6

${array[@]}将会获取数组中所有的元素

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值