shell
简介
Shell是一种脚本语言,通常用于在Unix和类Unix操作系统上进行命令行交互。它是用户与操作系统内核之间的接口,允许用户通过命令行或脚本文件来控制计算机上的操作。Shell程序通常用于执行复杂的任务,例如文件操作、网络通信、进程控制等。
Shell语言具有很高的灵活性,可以根据需要编写自定义脚本来自动化任务。Shell脚本通常包含一系列命令和流程控制语句,可以执行文件操作、程序运行、环境变量设置等任务。在Unix和类Unix操作系统中,常见的Shell包括Bash、Csh、Ksh等,它们都具有各自的特点和用法。Linux中默认使用bash。
运行
- 文件开头需写
#! /bin/bash
,指明默认的脚本解释器。 - 运行方式:
- 用解释器执行(可以没有权限):
bash test.sh
,test.sh是Shell脚本文件的名称。 - 作为可执行文件执行(必须要有权限):
chmod +x test.sh
,使脚本具有可执行权限。然后./test.sh
直接运行。 - 在终端中执行Shell命令,并执行脚本:
echo "echo Hello, World!" | sh
其中第一种方法较常用。
- 用解释器执行(可以没有权限):
语法
注释
-
单行注释(
#
注释)
在Shell脚本中,一行代码以#
开头时,该行代码就被认为是注释,Shell 解释器会将这一行代码忽略。例如:#! /bin/bash # This is a comment echo "Hello World!"
-
多行注释
在Shell脚本中,我们也可以使用一对: << EOF
和EOF
来实现多行注释,其中一对EOF可以换成其他字符串,如: << qingqiu
qingqiu
。#! /bin/bash : << suibian 第一行注释 第二行注释 第三行注释 suibian echo "Hello, World!"
变量
变量的命名规则
在Shell中,变量名遵循以下命名规则:
- 变量名必须以字母或下划线开头。
- 变量名中只能包含字母、数字和下划线。
- 变量名不能以数字开头。
- 变量名区分大小写。
- 变量名和变量值之间不能有空格。
- 如果变量值包含空格,需要使用引号将变量值括起来,例如
name="qing qiu"
。
处理变量
在Shell中,变量可以用来存储字符串或数字等信息。可以通过定义变量、给变量赋值、使用变量等操作来进行变量处理。
-
定义变量
定义变量有三种方法- name=qingqiu
- name=“qingqiu”
- name=‘qingqiu’
其中不加引号和加双引号效果相同,支持变量替换和转义字符的解析,例如:
name="qingqiu" echo "My name is $name" # 输出:My name is qingqiu
而单引号不支持变量替换和转义字符的解析,在单引号中,所有的字符都会被当作普通字符处理,例如:
name="qingqiu" echo 'My name is $name' # 输出:My name is $name
-
给变量赋值
可以使用=号来给变量赋值,等号两边不能有空格,否则会报错。
-
使用变量
使用变量时需要在变量名前加上$,或者${},{}
用于识别变量边界。例如:name=qingqiu echo $name # 输出qingqiu echo ${name} # 输出qingqiu echo $nameye # 输出nameye echo ${name}ye # 输出qingqiuye
-
只读变量
readonly
或者declare
可以将变量变为只读,修改只读变量时会报错。name=qingqiu readonly name declare -r name # 两种写法都可以 name=a # 会报错,因为此时name只读
取消只读属性:
unset -v name
-
删除变量
unset
可以删除变量。name=qingqiu unset name echo $name # 输出空行
要想删除只读变量,需要先取消只读属性,再用
unset
删除。
变量类型
局部变量与全局变量
- 自定义变量(局部变量)
子进程不能访问的变量。 - 环境变量(全局变量)
子进程可以访问的变量。
自定义变量与环境变量可以互相转换:
自定义变量→环境变量
name=qingqiu
export name # 方法一
declare -x name # 方法二
环境变量→自定义变量
export name=qingqiu # 定义环境变量,只在当前bash有效
declare +x name # 改为自定义变量
字符串
在shell中,字符串可以用单引号、双引号或不用引号来表示。单引号与双引号有区别,参考上述定义变量处。
字符串的操作
-
获取字符串长度
name="qingqiu" echo ${ #name} # 输出7
-
提取子串
name="qingqiu" echo ${name:0:4} # 提取从0开始的4个字符,输出qing
数字
数字变量用来存储数字类型的数据。在shell中,数字变量可以是整数或浮点数。
数组
数组中可以存放多个不同类型的值,下标从0开始,初始化时不需要指明数组大小。
- 定义
-
使用圆括号括起数组元素,并用空格隔开。例如:
array=(666 qing "qiu" haha)
-
使用花括号括起数组元素,并用逗号隔开。例如
array={ 666, qing, "qiu", haha}
-
直接定义数组中的某个元素的值:
array[0]=666 array[1]=qing array[2]="qiu" # 只输出引号内字符串,但建议使用"",以避免字符串含空格时出错 array