Chapter 3: What Is the Shell?
The Kernel and the Utilities
内核(Kernel)
定义:内核是操作系统的核心部分,负责管理硬件资源和提供基本的操作系统功能。
主要职责:
管理内存分配。
处理进程调度。
提供文件系统接口。
控制设备驱动程序。
工具(Utilities)
定义:工具是一系列独立的程序,用于执行特定任务。
例子:
ls:列出目录内容。
cp:复制文件或目录。
grep:搜索文本模式。
awk:文本处理工具。
Shell与内核和工具的关系
Shell作为用户和内核之间的桥梁,它解析用户的命令并调用相应的工具来完成任务。例如,当你在Shell中输入 ls 命令时,Shell会找到并执行 ls 工具,该工具反过来请求内核访问文件系统以获取目录内容。
The Login Shell
什么是登录Shell?
定义:登录Shell是用户登录系统时启动的第一个Shell实例。
特点:
执行特定的初始化脚本(如 .login 或 .cshrc),设置环境变量和其他配置。
可能需要验证用户身份(如通过密码)。
登录Shell的作用
初始化环境:设置路径、别名、提示符等。
执行用户自定义的启动脚本:允许用户定制自己的工作环境。
示例:查看当前Shell
Csh
深色版本
echo $SHELL
这条命令会输出当前使用的Shell路径,例如 /bin/csh。
Typing Commands to the Shell
如何向Shell输入命令?
直接输入命令:在命令行中键入命令并按回车键执行。
使用命令历史:可以通过上下箭头键浏览之前输入的命令。
命令补全:大多数Shell支持通过Tab键自动补全命令或文件名。
命令格式
命令通常由以下几部分组成:
命令名:要执行的命令或工具。
选项:修改命令行为的标志(如 -l 或 --long)。
参数:传递给命令的具体值(如文件名、用户名等)。
示例:使用命令及其选项和参数
列出详细信息:
Csh
深色版本
ls -l
复制文件并指定目标位置:
Csh
深色版本
cp source_file.txt /path/to/destination/
查找包含特定字符串的文件:
Csh
深色版本
grep "search_term" file.txt
The Shell’s Responsibilities
Shell的主要职责
命令解析:解释用户输入的命令,识别命令名、选项和参数。
命令执行:根据解析结果调用相应的工具或内置命令。
环境管理:设置和管理环境变量、别名、函数等。
作业控制:管理前台和后台进程,允许用户暂停、恢复或终止进程。
文件名替换:将通配符(如 * 和 ?)替换为匹配的文件名。
输入输出重定向:将命令的标准输入、输出或错误输出重定向到文件或其他命令。
管道操作:连接多个命令,使前一个命令的输出成为后一个命令的输入。
示例:展示Shell的职责
环境变量设置:
Csh
深色版本
setenv MY_VAR "This is a custom environment variable"
echo $MY_VAR
文件名替换:
Csh
深色版本
ls *.txt
输入输出重定向:
Csh
深色版本
cat file.txt > output.txt
管道操作:
Csh
深色版本
ps aux | grep "process_name"
作业控制:
Csh
深色版本
# 将命令放到后台运行
command &
# 查看后台作业
jobs
# 将作业移到前台
fg %1
# 暂停当前作业
Ctrl+Z
Chapter 4: Tools of the Trade
Regular Expressions
正则表达式(Regular Expressions)
定义:正则表达式是一种描述文本模式的符号系统,用于匹配、搜索和替换文本。
用途:广泛应用于文本处理命令如 grep, sed, awk 等。
常用元字符及其含义
.:匹配任意单个字符。
*:匹配前面字符零次或多次。
+:匹配前面字符一次或多次。
?:匹配前面字符零次或一次。
^:匹配行首。
$:匹配行尾。
[…]:匹配方括号内的任意一个字符。
[^…]:匹配不在方括号内的任意一个字符。
\:转义特殊字符。
示例:使用正则表达式查找文件中的特定模式
Csh
深色版本
grep "^[A-Z]" file.txt
这条命令会查找 file.txt 中以大写字母开头的行。
cut
cut 命令
用途:从每行文本中提取指定列的内容。
常用选项
-b list:选择指定字节位置的字符(适用于二进制文件)。
-c list:选择指定字符位置的字符。
-f list:根据分隔符选择字段。
-d delimiter:指定字段分隔符,默认是制表符。
-s:忽略没有分隔符的行。
示例:从CSV文件中提取第二列
假设有一个CSV文件 data.csv,其内容如下:
深色版本
name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
我们可以使用 cut 提取第二列:
Csh
深色版本
cut -d',' -f2 data.csv
输出将是:
深色版本
age
30
25
35
paste
paste 命令
用途:合并多个文件的对应行或将同一文件的多列并排显示。
常用选项
-d list:指定连接各列时使用的分隔符,默认是制表符。
-s:将每个文件的所有行串联成一行。
示例:合并两个文件的对应行
假设有两个文件 file1.txt 和 file2.txt,其内容分别为:
深色版本
# file1.txt
Alice
Bob
Charlie
深色版本
# file2.txt
30
25
35
我们可以使用 paste 将它们合并:
Csh
深色版本
paste file1.txt file2.txt
输出将是:
深色版本
Alice 30
Bob 25
Charlie 35
sed
sed 命令
用途:流编辑器,用于解析和转换文本。
常用选项
-n:仅打印匹配行。
-e script:添加脚本到命令列表。
-f script-file:从文件读取脚本。
-i:直接修改文件内容(注意:此选项在某些版本的 sed 中可能不可用)。
常用命令
s/pattern/replacement/:替换模式为替换字符串。
d:删除行。
p:打印行。
a\ text:在当前行后追加文本。
i\ text:在当前行前插入文本。
示例:替换文件中的特定字符串
假设我们有一个文件 example.txt,其中包含以下内容:
深色版本
Hello, World!
我们可以使用 sed 将 World 替换为 Universe:
Csh
深色版本
sed 's/World/Universe/' example.txt
输出将是:
深色版本
Hello, Universe!
tr
tr 命令
用途:转换或删除字符。
常用选项
-d set:删除指定字符集中的字符。
-s set:压缩重复字符。
-c:补集操作,即对指定字符集取反。
-t from-set to-set:将from-set中的字符翻译为to-set中的字符。
示例:将小写字母转换为大写
Csh
深色版本
echo "hello world" | tr '[:lower:]' '[:upper:]'
输出将是:
深色版本
HELLO WORLD
grep
grep 命令
用途:搜索文件中匹配给定模式的行。
常用选项
-i:忽略大小写。
-v:反转匹配,即显示不匹配的行。
-w:仅匹配整个单词。
-r 或 -R:递归搜索子目录中的文件。
-n:显示匹配行的行号。
-c:统计匹配行的数量。
-l:只列出包含匹配行的文件名。
-E:扩展正则表达式支持。
示例:查找文件中包含特定字符串的行
Csh
深色版本
grep "search_term" file.txt
如果要忽略大小写:
Csh
深色版本
grep -i "search_term" file.txt
sort
sort 命令
用途:对文件内容进行排序。
常用选项
-b:忽略每行开头的空白字符。
-d:按字典顺序排序(忽略非字母数字字符)。
-f:忽略大小写。
-g:按通用浮点数格式排序。
-M:按月份名称排序。
-n:按数值排序。
-r:逆序排序。
-k pos1[,pos2]:指定排序的关键字段。
-t char:指定字段分隔符。
示例:对文件内容按数值排序
假设有一个文件 numbers.txt,其内容如下:
深色版本
3
1
4
2
我们可以使用 sort 按数值排序:
Csh
深色版本
sort -n numbers.txt
输出将是:
深色版本
1
2
3
4
uniq
uniq 命令
用途:报告或过滤重复行。
常用选项
-c:在每行前加上出现次数。
-d:仅显示重复行。
-u:仅显示唯一行。
示例:显示文件中唯一的行
假设有一个文件 lines.txt,其内容如下:
深色版本
apple
banana
apple
orange
banana
我们可以使用 uniq 显示唯一行:
Csh
深色版本
sort lines.txt | uniq
输出将是:
深色版本
apple
banana
orange
Exercises
练习:
创建一个包含多个字段的CSV文件,并使用 cut 提取特定列。
合并两个文件的对应行,并使用 paste 将它们组合在一起。
编写一个简单的 sed 脚本来替换文件中的特定字符串。
使用 tr 将文件中的所有小写字母转换为大写。
使用 grep 查找文件中包含特定模式的所有行。
对文件内容进行排序,并使用 uniq 过滤掉重复行。
Chapter 5: And Away We Go
Command Files (Shell Scripts)
什么是命令文件?
定义:命令文件是一系列Shell命令的集合,保存在一个文件中,可以像普通命令一样执行。
用途:自动化任务、简化复杂操作、提高效率。
创建和运行Shell脚本
创建脚本文件:
Csh
深色版本
nano my_script.csh
编写脚本内容:
Csh
深色版本
#!/bin/csh
# This is a comment line
echo "Starting script..."
echo "Current directory: `pwd`"
echo "Listing files in current directory:"
ls
echo "Script completed."
保存并退出(在Nano编辑器中按 Ctrl+X,然后按 Y 确认保存)。
赋予执行权限:
Csh
深色版本
chmod +x my_script.csh
运行脚本:
Csh
深色版本
./my_script.csh
示例:创建一个带有条件判断和循环的脚本
假设我们想要创建一个脚本,根据当前时间输出不同的问候语,并列出当前目录下的所有文件。
创建脚本文件:
Csh
深色版本
nano greet_and_list_files.csh
编写脚本内容:
Csh
深色版本
#!/bin/csh
# Get current hour
set HOUR = `date +%H`
# Determine greeting based on time of day
if ( $HOUR < 12 ) then
echo "Good morning!"
else if ( $HOUR < 18 ) then
echo "Good afternoon!"
else
echo "Good evening!"
endif
# List all files in the current directory
echo "Files in the current directory:"
foreach file (`ls`)
echo " $file"
end
保存并退出(在Nano编辑器中按 Ctrl+X,然后按 Y 确认保存)。
赋予执行权限:
Csh
深色版本
chmod +x greet_and_list_files.csh
运行脚本:
Csh
深色版本
./greet_and_list_files.csh
Variables
什么是变量?
定义:变量是存储数据的容器,可以在脚本中引用和修改。
特点:
可以存储字符串、数字等不同类型的数据。
变量名区分大小写。
设置和使用变量
设置变量:
Csh
深色版本
set MY_VAR = "This is a variable"
引用变量:
Csh
深色版本
echo $MY_VAR
临时设置环境变量(仅在当前Shell会话中有效):
Csh
深色版本
setenv NEW_VAR "This is an environment variable"
echo $NEW_VAR
永久设置环境变量(需要编辑配置文件如 ~/.cshrc 或 ~/.login):
Csh
深色版本
# 在 ~/.cshrc 文件末尾添加一行
echo 'setenv NEW_VAR "This is a permanent environment variable"' >> ~/.cshrc
source ~/.cshrc
符号>> 是 shell 中的输出重定向操作符之一,表示将前面命令的输出追加到指定文件的末尾,而不是覆盖原有内容。
示例:创建一个带有变量的脚本
假设我们想要创建一个脚本,根据用户输入的名字输出个性化的问候信息。
创建脚本文件:
Csh
深色版本
nano greet_user.csh
编写脚本内容:
Csh
深色版本
#!/bin/csh
# Prompt user for their name
echo "Please enter your name:"
set NAME = $<
# Print personalized greeting message
echo "Hello, $NAME!"
保存并退出(在Nano编辑器中按 Ctrl+X,然后按 Y 确认保存)。
赋予执行权限:
Csh
深色版本
chmod +x greet_user.csh
运行脚本:
Csh
深色版本
./greet_user.csh
Built-in Integer Arithmetic
C Shell中的整数运算
定义:C Shell提供了内置的整数运算功能,可以直接在脚本中进行简单的数学计算。
常用运算符:
+:加法。
-:减法。
*:乘法。
/:除法。
%:取模(求余数)。
示例:使用内置整数运算
假设我们想要创建一个脚本来计算两个数的和、差、积和商。
创建脚本文件:
Csh
深色版本
nano calculate.csh
编写脚本内容:
Csh
深色版本
#!/bin/csh
# Prompt user for two numbers
echo "Enter the first number:"
set num1 = $<
echo "Enter the second number:"
set num2 = $<
# Perform arithmetic operations
set sum = `expr $num1 + $num2`
set diff = `expr $num1 - $num2`
set product = `expr $num1 \* $num2`
set quotient = `expr $num1 / $num2`
set remainder = `expr $num1 % $num2`
# Display results
echo "Sum: $sum"
echo "Difference: $diff"
echo "Product: $product"
echo "Quotient: $quotient"
echo "Remainder: $remainder"
保存并退出(在Nano编辑器中按 Ctrl+X,然后按 Y 确认保存)。
赋予执行权限:
Csh
深色版本
chmod +x calculate.csh
运行脚本:
Csh
深色版本
./calculate.csh
Exercises
练习:
创建一个包含多个命令的Shell脚本,并测试其功能。
编写一个脚本,接受用户输入的姓名和年龄,并输出一条个性化的问候信息。
编写一个脚本,计算两个整数的和、差、积和商,并显示结果。
创建一个脚本,检查给定的年份是否为闰年。
编写一个脚本,根据当前时间输出不同的问候语,并列出当前目录下的所有文件。
463

被折叠的 条评论
为什么被折叠?



