Shell(一)

简介

Shell 简介

从技术角度,Shell最简单的定义为命令行解释器,主要包含:

  • 将使用者的命令翻译给核心(kernel)处理
  • 同时,将核心的处理结果翻译给使用者

对比Windows GUI,我们操作的Windows并不是直接操作操作系统内核的,而是通过图形接口,点击,等的一系列操作来使用的
shell对之Linux,同样有着相同的作用,主要就是对我们的指令进行解析,解析指令给Linux内核。再通过Linux内核运行得出结果,通过shell解析给用户

Shell 脚本

  • Shell是一种应用程序,由C语言编写出来的,是用户使用Linux的桥梁
  • Shell脚本(shell script),是一种为Shell编写的脚本程序

这两个概念需要进行区分,为简介起见,本文中出现的shell指shell脚本编程

Shell 环境:

本文中采用的是大多数Linux系统默认的Shell----Bash,即Bourne Again Shell (/bin/bash)
Linux下的其他Shell:

  • Bourne Shell(/usr/bin/sh 或 /usr/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)

第一个Shell脚本

编写

新建一个文件,形如“test.sh”,扩展名为sh,起到见名知意作用,并不影响脚本的执行

#!/bin/bash
echo "Hello World!"

第一行是默认生成的,"#!"是一个约定的标记,其后的路径告诉操作系统当前这个脚本需要什么解释器来执行。在操作系统安装了其他shell程序的情况下,可以将这个后面的内容替换成上述Shell环境中的脚本程序路径
echo命令用于向窗口输出文本

运行

有两种运行shell脚本的方法:

一、作为可执行程序

就是将上述脚本代码保存在文件中后,在当前目录下给之加上可执行的权限即可

[adam@aliyun ~]# chmod +x ./test.sh   # 使脚本具有可执行权限
[adam@aliyun ~]# ./test.sh  # 执行脚本
Hello World!

【注意】:一定要写成"./test.sh"形式,而不是"test.sh",运行所有的二进制程序也是一样

二、作为解释器参数

这种方式就是直接运行解释器,它的参数就是shell脚本的文件名

[adam@aliyun ~]# /bin/sh test.sh
Hello World!

这种方式运行的脚本,脚本内容中的第一行指定解释器信息就会失效(作为注释)

Shell注释

单行注释

以 ‘#’ 开头的行就是注释,会被解释器忽略

多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

Shell变量

定义

形如:

user_name="Adam Xi"
use_id=2344
ID=2344
_var='x'

注意:变量名和等号之间不能有空格,同时,变量名命名规则如下:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

形如"?name、1name、usr*bin"等都是无效命名

使用

  • 使用一个定义过的变量,只需在变量名前面加美元 $ 符号
  • 变量名外面的花括号{}是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
  • 已经定义的变量,可以被重新定义
    验证如下:
#!/bin/bash
user_name="Adam Xi"
echo $user_name
user_name="Shell"
echo "I am good at ${user_name}Script"
user_name="Shell"
echo "I am good at $user_nameScript"

结果如下:若是未加花括号的变量如果后面紧挨着输出的数据,那么解释器会将$后面的一串字符当成一个未定义的变量,所以输出为空

[adam@aliyun test]# ./test.sh
Adam Xi
I am good at ShellScript
I am good at 

只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变

#!/bin/bash
user_name="Adam Xi"
echo $user_name
readonly user_name
user_name="Shell"

运行脚本,结果如下:

[adam@aliyun test]# ./test.sh
Adam Xi
./test.sh: line 105: user_name: readonly variable

删除变量

使用unset命令用以删除变量,被删除后的变量不能再次使用。unset命令不能删除只读变量

#!/bin/bash
user_name="Adam Xi"
echo $user_name
unset user_name
echo $user_name

proc_name="Shell"
readonly proc_name
unset proc_name
echo $proc_name

运行脚本,结果如下:

[root@aliyun test]# ./test.sh
Adam Xi

./test.sh: line 114: unset: proc_name: cannot unset: readonly variable
Shell

变量类型

运行shell时,会同时存在三种类型变量

  1. 局部变量:定义在脚本或命令中,尽在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  2. 环境变量:所有的程序包括shell启动的程序,都能够访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量
  3. shell变量:shell变量时有shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

shell字符串

shell中字符串既可以用单引号,也可以用双引号,也可以不用引号

单引号

【注意】:

  • 单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可以成对出现,作为字符串拼接使用
双引号

双引号的优点:

  • 双引号内部可以有变量
  • 双引号内部可以出现转义字符
拼接字符串
#!/bin/bash

user_name="Adam Xi"                                                                                                               
# 使用双引号拼接
str1="hello, "$user_name"!"
echo $str1 
str2="hello, ${user_name}!"
echo $str2
# 使用单引号拼接
str3='hello, '$user_name'!'
echo $str3
str4='hello, ${user_name}!'
echo $str4
[adam@aliyun test]# ./test.sh
hello, Adam Xi!
hello, Adam Xi!
hello, Adam Xi!
hello, ${user_name}!
获取字符串长度
#!/bin/bash

user_name="Adam Xi"
echo ${#user_name}
# 输出 7
提取子字符串

下面实例中第一位数字表示开始位置,第二个数字表示结束位置
第一个字符的索引为0,即从0开始

#!/bin/bash

user_name="Adam Xi"                                                                                                               
echo ${user_name::4}
echo ${user_name:0:4}
echo ${user_name:5:6}
echo ${user_name:5:}

运行结果如下:

[adam@aliyun test]# ./test.sh
7
Adam
Adam
Xi
    # 空行,输出为空
查找子字符串

查找字符 i 或 o 第一次出现的位置(哪个字母先出现就计算哪个)

#!/bin/bash

str="my name is Adam-Xi"   
echo `expr index "$str" io`   
# 输出 9                                                                                                                              

shell数组

bash支持一维数组,不支持多维数组。数组下标从0开始

定义数组

在Shell中,用括号表示数组,数组元素用“空格”符号分隔开。其一般形式为:

array_name=(value0 value1 value2 … valuen)
或者
array_name=(
value0
value1
value2

valuen
)
又或者
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

读取数组

一般形式为 ${数组名[下标]}
使用@符号可以获取数组中的所有元素,如

echo ${array_name[@]}

获取数组长度

# 获取数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 获取数组单个元素的长度
length_n=${#array_name[n]}

实例如下:

#!/bin/bash

array=(1 2 3 4 5 6 7 8 9)  # 定义数组
echo ${array[@]}  # 输出整个数组
length=${#array[@]}  # length=${#array[*]}   # 获取数组元素的个数
echo $length
length=${#array[n]}  # 获取数组单个元素的长度                                                                                     
echo $length

运行结果如下:

[root@aliyun test]# ./test.sh
1 2 3 4 5 6 7 8 9
9
1

LOADING…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值