Shell基础
Shell 是一种命令行解释器,用于与操作系统内核进行交互。它允许用户通过输入命令来执行各种操作,如文件管理、进程控制、系统管理等。Shell 脚本是由一系列 Shell 命令组成的文本文件,可以自动化执行任务。以下是 Shell 语法的核心内容:
1. Shell 脚本的基本结构
一个典型的 Shell 脚本包括以下部分:
- Shebang:指定脚本使用的 Shell 解释器。
- 注释:以
#
开头的行是注释。 - 命令:要执行的 Shell 命令。
#!/bin/bash
# 这是一个简单的 Shell 脚本
echo "Hello, World!"
2. 变量
- 定义变量:变量名=值(注意:等号两边不能有空格)。
- 使用变量:用
$
引用变量。
name="John"
echo "Hello, $name"
- 环境变量:系统预定义的变量,如
$HOME
、$PATH
。 - 只读变量:使用
readonly
定义只读变量。
readonly PI=3.14
3. 字符串
- 单引号:原样输出字符串,不解析变量。
- 双引号:解析变量和转义字符。
name="John"
echo 'Hello, $name' # 输出:Hello, $name
echo "Hello, $name" # 输出:Hello, John
- 字符串操作:
- 获取长度:
${#string}
- 截取子串:
${string:start:length}
- 获取长度:
str="Hello, World"
echo ${#str} # 输出:12
echo ${str:0:5} # 输出:Hello
4. 数组
- 定义数组:用括号括起来,元素之间用空格分隔。
- 访问数组:用
${array[index]}
。
fruits=("Apple" "Banana" "Cherry")
echo ${fruits[0]} # 输出:Apple
echo ${fruits[@]} # 输出所有元素
echo ${#fruits[@]} # 输出数组长度
5. 条件判断
- if 语句:
- 语法:
if [ condition ]; then ... fi
- 条件表达式:
- 字符串比较:
=
,!=
- 数字比较:
-eq
,-ne
,-gt
,-lt
- 文件测试:
-e
(存在)、-d
(目录)、-f
(文件)
- 字符串比较:
- 语法:
if [ "$name" = "John" ]; then
echo "Hello, John"
elif [ "$name" = "Jane" ]; then
echo "Hello, Jane"
else
echo "Hello, Stranger"
fi
- case 语句:
- 语法:
case ... in ... esac
- 语法:
case "$fruit" in
"Apple")
echo "It's an apple."
;;
"Banana")
echo "It's a banana."
;;
*)
echo "Unknown fruit."
;;
esac
6. 循环
- for 循环:
- 语法:
for var in list; do ... done
- 语法:
for fruit in "Apple" "Banana" "Cherry"; do
echo "$fruit"
done
- while 循环:
- 语法:
while [ condition ]; do ... done
- 语法:
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
count=$((count + 1))
done
- until 循环:
- 语法:
until [ condition ]; do ... done
- 语法:
count=1
until [ $count -gt 5 ]; do
echo "Count: $count"
count=$((count + 1))
done
7. 函数
- 定义函数:
function_name() { ... }
- 调用函数:直接写函数名。
greet() {
echo "Hello, $1"
}
greet "John" # 输出:Hello, John
- 返回值:使用
return
返回整数值,或通过echo
返回字符串。
add() {
return $(($1 + $2))
}
add 3 5
echo "Sum: $?" # 输出:Sum: 8
8. 输入输出
- 读取输入:使用
read
命令。
echo "Enter your name:"
read name
echo "Hello, $name"
- 输出重定向:
>
:覆盖文件。>>
:追加到文件。2>
:重定向错误输出。
echo "Hello" > output.txt
echo "World" >> output.txt
ls non_existent_file 2> error.log
9. 特殊变量
$0
:脚本名称。$1
,$2
, …:脚本参数。$#
:参数个数。$@
:所有参数。$?
:上一条命令的退出状态。$$
:当前脚本的进程 ID。
echo "Script: $0"
echo "First argument: $1"
echo "Number of arguments: $#"
echo "All arguments: $@"
10. 文件操作
- 判断文件是否存在:
if [ -e "file.txt" ]; then echo "File exists" fi
- 读取文件内容:
while read line; do echo "$line" done < file.txt
11. 调试 Shell 脚本
- 使用
-x
选项运行脚本,打印每条命令及其结果。bash -x script.sh
- 在脚本中启用调试:
set -x # 开启调试 set +x # 关闭调试
12. 常用命令
- 文件操作:
ls
:列出目录内容。cp
:复制文件。mv
:移动文件。rm
:删除文件。mkdir
:创建目录。
- 文本处理:
cat
:显示文件内容。grep
:搜索文本。sed
:流编辑器。awk
:文本处理工具。
- 系统管理:
ps
:查看进程。kill
:终止进程。top
:实时系统监控。
总结
Shell 语法是 Linux/Unix 系统管理和自动化任务的基础。通过掌握变量、条件判断、循环、函数、文件操作等核心语法,你可以编写高效的 Shell 脚本来完成各种任务。