摘要
在Linux系统中,$符号扮演着至关重要的角色,尤其是在Bash shell脚本编程中。本文将详细介绍$符号的各种基础用法,帮助用户更好地理解和运用它。
内置变量
-
NR :当前记录(行)号。
-
NF :当前记录的字段数量。
-
FS :字段分隔符(默认为空格或制表符)。
-
OFS :输出字段分隔符(默认为空格)。
-
RS :记录分隔符(默认为换行符)。
-
ORS :输出记录分隔符(默认为换行符)。
$用法整理
1. $a 获取变量a的值
在Linux中,$符号用于获取变量的值。例如,如果你设置了变量`a=1`,可以通过`echo $a`来打印变量`a`的值,即1。需要注意的是,为了防止变量中的空格和其他特殊字符导致问题,推荐在引用变量时使用双引号,如`echo "$a"`。
2. $0, $1, $n
在命令行参数中,$0代表脚本的名字,$1, $2, ..., $n分别代表传递给脚本的第一个、第二个、直至第n个参数。
3. $#
$#返回参数的数量,即传递给脚本或函数的参数总数。
4. $@ 和 $*
`$@`包含所有参数,每个参数都被双引号包围,而`$*`则将所有参数视为一个单独的字符串。例如,如果传递了两个参数`arg1`和`arg2`,`echo "$@"`将分别显示`arg1`和`arg2`,而`echo "$*"`将显示`arg1 arg2`。
5. $?
$?返回上一个命令的退出状态。如果命令执行成功,其值为0,否则为非零值。
6. $()
这是命令替换的语法,用于执行命令并将结果插入到当前命令行中。例如,`echo "Today is $(date)"`将打印当前日期。
7. ${}
用于变量的扩展和操作,比如`${var:-default}`表示如果`var`未定义,则使用`default`作为默认值。还有`${var#pattern}`,它会去除`var`前面匹配`pattern`的部分。
8. ${#var}
返回变量`var`的值的长度。
9. $[] 或 `[ ]`
这是条件测试命令,用于检查表达式的真假。例如,`[ "$a" == "i am skyler" ]`会判断变量`a`的值是否等于字符串`i am skyler`。
10. $-
显示当前shell选项的设置。这些选项影响shell的行为。
11. $!
返回最近后台进程的进程ID
12. $$
返回当前进程ID,通常是运行的shell的ID。
13. !$ 和 !!
`!$`引用最后一个命令的最后一个参数,而`!!`引用整个上一条命令
特殊用法说明
"$a" 不做词法分析
使用双引号`"`包围$符号可以保护变量免受shell词法分析的影响,确保变量内容按原样处理。例如,如果`a="i am skyler"`,`echo "$a"`将输出整个字符串,而`echo $a`可能会导致解析错误,因为它会尝试将字符串视为多个参数。
掌握这些$符号的用法能够显著提升在Linux环境中工作的效率,避免因对符号理解不准确而产生的错误。虽然在面试中可能不常被问及,但在日常的系统管理和脚本编写中却是不可或缺的知识点。通过实践和理解这些用法,你将能更熟练地驾驭Linux系统。
三种引号
在Linux系统中,有着三种引号——单引号、双引号和反引号。这三个引号的作用如下:
- 双引号:可以把引号内的内容作为一个整体,保留特殊符号,不做特殊处理。(弱引用,可以实现变量替换)
- 单引号:除了作为一个整体外,还可以将引号内的所有内容转义为单纯的字符串。(强引用,不完成变量替换)
- 反引号:把引号内的命令执行后返回结果。(命令替换)
[root]# echo "$PATH"
/usr/local/java/jdk1.8.0_202/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root]# echo '$PATH'
$PATH
[root]# echo `date +%F-%H-%M-%S`
2025-01-21-15-13-45
附件一:Linux基本操作
1. 目录操作
-
pwd
:显示当前所在目录的绝对路径。 -
cd
:切换目录。cd /path/to/directory # 进入指定目录 cd .. # 返回上级目录 cd ~ # 返回用户主目录
-
ls
:列出目录内容。ls # 列出当前目录内容 ls -l # 详细列表(权限、大小、时间) ls -a # 显示隐藏文件(以`.`开头) ls -lh # 文件大小以易读格式(KB/MB)显示
-
mkdir
/ rmdir
:创建/删除目录。mkdir my_folder # 创建目录 mkdir -p a/b/c # 递归创建多层目录 rmdir empty_folder # 删除空目录
2. 文件操作
-
touch
:创建空文件或更新文件时间戳。touch file.txt
-
cp
:复制文件或目录。cp file.txt file_backup.txt # 复制文件 cp -r dir1 dir2 # 递归复制目录
-
mv
:移动/重命名文件或目录。mv file.txt new_location/ # 移动文件 mv old_name.txt new_name.txt # 重命名文件
-
rm
:删除文件或目录(⚠️ 谨慎使用)。rm file.txt # 删除文件 rm -r directory # 递归删除目录及其内容 rm -f file.txt # 强制删除(不提示确认)
-
cat
/ less
/ head
/ tail
:查看文件内容。cat file.txt # 显示整个文件内容 less file.txt # 分页查看文件(按`q`退出) head -n 5 file.txt # 显示文件前5行 tail -n 10 file.txt # 显示文件末尾10行 tail -f log.txt # 实时追踪文件更新(常用于日志)
3. 权限管理
-
chmod
:修改文件权限。chmod +x script.sh # 添加执行权限 chmod 755 file.txt # 权限设置为rwxr-xr-x # 权限数字表示法:r=4, w=2, x=1
-
chown
:修改文件所有者。chown user:group file.txt
4. 查找与搜索
-
find
:查找文件。find /path -name "*.txt" # 按名称查找 find . -type d # 查找所有目录
-
grep
:文本搜索。grep "keyword" file.txt # 在文件中搜索关键词 ps aux | grep "nginx" # 结合管道搜索进程 grep -r "error" /var/log/ # 递归搜索目录中的关键词
5. 进程管理
-
ps
:查看进程状态。ps aux # 显示所有运行中的进程
-
kill
:终止进程。
kill 1234 # 终止PID为1234的进程
kill -9 1234 # 强制终止进程
-
top
/ htop
:实时查看系统资源占用。
6. 输入输出重定向
-
>
/ >>
:重定向输出。echo "Hello" > output.txt # 覆盖写入文件 echo "World" >> output.txt # 追加到文件末尾
-
|
(管道):将前一个命令的输出作为后一个命令的输入。cat file.txt | grep "error" | sort
7. 环境变量与别名
-
环境变量:
echo $PATH # 查看PATH变量 export MY_VAR="123" # 设置临时环境变量
-
alias
:创建命令别名。alias ll='ls -lh' # 输入`ll`等效于`ls -lh`
8. 帮助与文档
-
man
:查看命令手册。man ls
-
--help
:快速查看命令帮助。ls --help
示例:组合命令
# 统计当前目录中.txt文件的行数总和
find . -name "*.txt" | xargs wc -l
# 将当前时间写入日志文件并压缩
date >> log.txt && tar -czvf log.tar.gz log.txt