变量
- 变量声明不使用数据类型,默认类型为字符串。
- 变量名区分大小写,通常由字母、数字和下划线组成,但不能以数字开头。
- 变量赋值时不加空格,如
VAR=value
。 - 使用变量时加上
$
符号,如$VAR
。
环境变量
环境变量的特点
- 全局可访问: 环境变量在定义后可以被当前Shell及其子进程访问。
- 命名规范: 通常由大写字母、数字和下划线组成,例如
PATH
、HOME
等。名称区分大小写。
常见的环境变量
PATH
: 定义了操作系统用来查找可执行文件的目录列表。各个目录之间使用冒号(:
)分隔。HOME
: 当前用户的主目录路径。USER
: 当前用户的用户名。SHELL
: 当前Shell的路径。PWD
: 当前工作目录。OLDPWD
: 上一个工作目录。LANG
: 系统的语言和地区设置
环境变量的设置和使用
- 查看环境变量: 使用
echo
命令,如echo $PATH
。 - 设置环境变量: 使用
export
命令,如export VAR=value
。这样定义的环境变量会被当前Shell会话及其子进程继承。 - 本地变量: 只在当前Shell进程中有效的变量。它们通过简单赋值定义,如
VAR=value
,而不使用export
。
位置变量
位置变量是Shell脚本中的一种特殊变量,用于访问传递给脚本或函数的参数。它们被称为“位置”变量是因为它们的名称是根据参数的位置确定的。
基本位置变量
$0
: 表示脚本或命令本身的名字。这通常是脚本的文件名或命令的名称。$1, $2, $3, ...
: 表示传递给脚本或函数的第一个、第二个、第三个等参数。参数的位置从1开始编号。
特殊位置变量
$#
: 表示传递给脚本或函数的参数的个数。$@
: 表示传递给脚本或函数的所有参数,每个参数都作为独立的字符串存在。通常在双引号中使用,如"$@"
,这样会将每个参数视为单独的字符串,保持参数原有的分割性。$*
: 表示传递给脚本或函数的所有参数,参数作为一个单一的字符串存在。通常在双引号中使用,如"$*"
, 这样所有的参数将被视为一个整体。$?
: 表示上一个命令的退出状态。成功执行通常返回0,失败返回非零值。$$
: 表示当前Shell进程的进程ID (PID)。$!
: 表示最后一个后台进程的进程ID (PID)。
使用位置变量的注意事项
- 位置变量是只读的,无法直接修改。
- 参数的位置在调用时固定,位置变量的值不会因为其他变量的改变而变化。
$@
和$*
的区别在于双引号中的表现:"$@"
会将每个参数作为独立的单元处理,而"$*"
会将所有参数合并为一个字符串。
文件信息
ll
是ls -l
的快捷命令,用于列出目录中的文件和子目录,并显示详细信息。每一行输出的信息表示一个文件或目录的详细信息,包括权限、链接数、所有者、组、大小、修改时间等
文件类型和权限
第一列由10个字符组成,用于显示文件的类型和权限。
- 第一个字符表示文件类型:
-
表示普通文件。d
表示目录。l
表示符号链接(软链接)。c
表示字符设备文件。b
表示块设备文件。s
表示套接字文件。p
表示命名管道文件
后面9个字符分为3组,每组3个字符,表示文件所有者、所属组和其他用户的权限。每组三个字符表示读(r
)、写(w
)、执行(x
)权限:
r
: 读权限w
: 写权限x
: 执行权限-
: 无权限
-
链接数
第二列表示链接数,即有多少个硬链接指向该文件或目录。对于目录,它表示有多少个子目录。 -
所有者
第三列表示文件的所有者(用户)。 -
组
第四列表示文件所属的组。 -
文件大小
第五列表示文件的大小(以字节为单位)。对于目录,它通常显示的是目录文件本身的大小。 -
最后修改时间
第六列表示文件的最后修改时间。具体格式为月 日 时间/年
,当文件的最后修改时间是六个月内的显示格式为月 日 时间
,而超过六个月的显示格式为月 日 年份
。 -
文件名
最后一列表示文件的名称或目录的名称。对于符号链接,还会显示链接的目标。 -
drwxr-xr-x 2 user group 4096 Aug 1 12:34 example_directory -rw-r--r-- 1 user group 123 Aug 1 12:34 example_file.txt lrwxrwxrwx 1 user group 11 Aug 1 12:34 example_link -> target_file
example_directory
是一个目录(由d`
表示),所有者和组有读取、写入和执行权限,其他用户只有读取和执行权限。链接数为2。example_file.txt
是一个普通文件,所有者有读取和写入权限,组和其他用户只有读取权限。文件大小为123字节。example_link
是一个符号链接(由l
表示),它指向target_file
。
运算
1. 算术运算
$(( ... ))
: 这是Shell中的内建算术计算方式,支持基本的算术运算符。- 加法:
+
- 减法:
-
- 乘法:
*
- 除法:
/
- 取模:
%
- 递增:
++
- 递减:
--
- 加法:
例如,计算两个变量a
和b
的和可以写作result=$((a + b))
。
2.expr
命令
expr
命令用于评估表达式并返回结果。它是一个外部命令,通常用于较简单的算术运算。- 使用时,运算符和操作数之间必须有空格。
- 例如:
result=$(expr 3 + 2)
。
3. 基本赋值
- 语法:
VAR=value
- 等号两边不能有空格,否则会被解释为命令和参数。
if语句
基本语法
if [ condition ]; then
# 当条件为真时执行的命令
elif [ another_condition ]; then
# 当另一个条件为真时执行的命令
else
# 当上述所有条件都不为真时执行的命令
fi
文件测试
-e file
:判断文件是否存在。-f file
:判断是否为普通文件。-d file
:判断是否为目录。-r file
:判断文件是否可读。-w file
:判断文件是否可写。-x file
:判断文件是否可执行。
#!/bin/bash
# 检查文件是否存在
if [ -e "/path/to/file" ]; then
echo "文件存在"
elif [ -d "/path/to/directory" ]; then
echo "目录存在"
else
echo "文件和目录均不存在"
fi
整数比较
[ number1 -eq number2 ]
:等于。[ number1 -ne number2 ]
:不等于。[ number1 -lt number2 ]
:小于。[ number1 -le number2 ]
:小于等于。[ number1 -gt number2 ]
:大于。[ number1 -ge number2 ]
:大于等于。
while语句
基本语法
while [ condition ]; do
# 循环体
# 当条件为真时执行的命令
done
计数器
#!/bin/bash
count=1
while [ $count -le 5 ]; do
echo "Count is $count"
count=$((count + 1))
done
while
循环会打印从1到5的数字,每次迭代后count
变量递增1,直到条件$count -le 5
不再满足为止
文件读取
#!/bin/bash
filename="file.txt"
while read -r line; do
echo "Read line: $line"
done < "$filename"
for语句
基本语法
for variable in value1 value2 value3; do
# 循环体
# 对每个值执行的命令
done
variable
是循环中用于存储当前值的变量。value1
、value2
、value3
是待遍历的值。
范围遍历
for variable in {start..end}; do
# 循环体
# 对每个值执行的命令
done
until语句
until
循环的逻辑与while
循环相反:until
循环在条件为假时继续执行,条件变为真时停止执行。
基本语法
until [ condition ]; do
# 循环体
# 当条件为假时执行的命令
done
示例
#!/bin/bash
count=1
until [ $count -gt 5 ]; do
echo "Count is $count"
count=$((count + 1))
done
在这个示例中,until
循环会持续执行,直到count
大于5。每次迭代中,count
的值都会递增1。