Shell
一、Shell 脚本入门
Shell 脚本是一种为了完成特定任务而编写的程序,它可以在 Unix/Linux 系统上运行。脚本文件通常以 .sh 结尾,并且需要有执行权限才能运行。
例如下面是一个简单的 Shell 脚本:
Bash |
---|
| #!/bin/bash # 指定使用的 Shell 解释器
echo "Hello World" # 输出 Hello World
|
第一行 #!/bin/bash
是指定解释器的命令,这告诉系统这个脚本应该使用哪个 Shell 来解释。这里我们使用的是 Bash。
第二行 echo "Hello World"
是输出 Hello World 的命令。
要执行这个脚本,我们需要将其保存为一个 .sh 文件,并赋予执行权限:
Bash |
---|
| chmod +x helloworld.sh # 赋予执行权限
./helloworld.sh # 运行脚本
|
执行结果应该是输出了 Hello World。
除了直接运行脚本,还可以通过以下方式执行:
Bash |
---|
| bash helloworld.sh
sh helloworld.sh
|
二、Shell 变量和字符串操作
Shell 变量用来存储数据,可以在脚本中被引用和修改。
定义变量可以使用等号 =
,注意等号两边不能有空格。例如:
变量名只能由字母、数字和下划线组成,不能以数字开头。
引用变量可以使用 $
符号,例如:
Bash |
---|
| echo "My name is $name and I am $age years old."
|
上面的代码打印了一个句子,其中 $name
和 $age
将被替换为定义的变量值。
需要注意的是,如果变量值中包含空格或特殊字符,需要使用引号来包裹变量名。例如:
Bash |
---|
| GREETING="Hello, World!"
echo $GREETING # 输出 Hello, World!
echo "$GREETING" # 输出 Hello, World!
|
Shell 还内置了许多对字符串操作的函数,例如:
${#string}
:获取字符串长度。
${string:position:length}
:截取字符串。
${string/search/replace}
:替换字符串中的文本。
例如:
Bash |
---|
| str="hello world"
echo ${#str} # 输出 11
echo ${str:0:5} # 输出 hello
echo ${str/world/earth} # 输出 hello earth
|
三、条件判断和循环控制
Shell 脚本可以进行条件判断和循环控制。
if-else 语句可以按照条件分支来执行不同的命令:
Bash |
---|
| if [ "$name" == "John" ]; then
echo "Hello John!"
else
echo "Hello stranger!"
fi
|
case 语句可以根据不同的情况执行不同的命令:
Bash |
---|
| case "$name" in
John)
echo "Hello John!"
;;
*)
echo "Hello stranger!"
;;
esac
|
while 循环可以在条件满足时一直执行某个命令:
Bash |
---|
| n=1
while [ $n -le 10 ]; do
echo "$n"
n=$((n+1))
done
|
for 循环可以遍历一个列表或者数字范围:
Bash |
---|
| names="John Tom Jerry"
for name in $names; do
echo "Hello $name!"
done
for i in {1..5}; do
echo "$i"
done
|
四、Shell 函数和命令行参数
Shell 脚本可以定义和调用函数,在函数中使用 return 命令返回值,也可以在命令行传递参数。
定义函数的语法如下:
Bash |
---|
| function_name() {
command1
command2
# ...
return value
}
|
调用函数的语法如下:
Bash |
---|
| function_name arg1 arg2 ...
|
其中 arg1 arg2 等为传递给函数的参数。
例如:
Bash |
---|
| function say_hello() {
echo "Hello, $1!"
}
say_hello "John" # 输出 Hello, John!
|
命令行参数可以使用 $1
、$2
、$3
等变量来引用。例如:
Bash |
---|
| echo "First argument: $1"
echo "Second argument: $2"
echo "All arguments: $@"
echo "Number of arguments: $#"
|
如果将上面的代码保存为脚本文件 example.sh,并执行 ./example.sh hello world
,则输出结果为:
Text Only |
---|
| First argument: hello
Second argument: world
All arguments: hello world
Number of arguments: 2
|
五、Shell 文件操作
Shell 脚本可以对文件进行读写、复制、移动、删除和权限控制等操作。
读取文件内容可以使用 cat 命令:
复制文件可以使用 cp 命令:
Bash |
---|
| cp file.txt file_backup.txt
|
移动文件可以使用 mv 命令:
Bash |
---|
| mv file_backup.txt ../backup/file.txt
|
删除文件可以使用 rm 命令:
修改文件权限可以使用 chmod 命令:
Bash |
---|
| chmod +x script.sh # 赋予执行权限
chmod 644 file.txt # 修改文件权限为 644
|
六、Shell 数组和集合操作
Shell 支持数组操作,可以通过下标访问数组元素:
Bash |
---|
| names=("John" "Tom" "Jerry")
echo ${names[0]} # 输出 John
echo ${names[1]} # 输出 Tom
echo ${names[2]} # 输出 Jerry
names[3]="Mike"
echo ${names[@]} # 输出 John Tom Jerry Mike
|
Shell 还支持集合操作,例如获取两个数组的交集、并集和差集:
Bash |
---|
| a=("John" "Tom" "Jerry")
b=("Tom" "Mike")
# 交集
intersect=($(echo "${a[@]}" "${b[@]}" | tr ' ' '\n' | sort | uniq -d))
# 并集
union=($(echo "${a[@]}" "${b[@]}" | tr ' ' '\n' | sort | uniq))
# 差集
diff=($(echo "${a[@]}" "${b[@]}" "${b[@]}" | tr ' ' '\n' | sort | uniq -u))
echo "Intersect: ${intersect[@]}"
echo "Union: ${union[@]}"
echo "Diff: ${diff[@]}"
|
七、Shell 正则表达式
Shell 支持基础正则表达式语法,可以使用 =~ 操作符进行模式匹配:
Bash |
---|
| str="hello world"
if [[ $str =~ ^he ]]; then
echo "Matched"
else
echo "Not matched"
fi
|
上面的代码会输出 Matched。
八、Shell 高级主题
Shell 还有许多高级特性,例如调试、进程管理、信号处理、管道和重定向、awk 和 sed 等工具的使用等。
调试脚本可以使用 set 命令:
Bash |
---|
| set -x # 开启调试模式
# ... 命令 ...
set +x # 关闭调试模式
|
查看进程信息可以使用 ps 命令:
Bash |
---|
| ps -ef # 列出所有进程信息
ps -ef | grep "process_name" # 根据进程名过滤
|
Shell 可以捕获和处理信号:
Bash |
---|
| trap "echo 'Exit signal caught'" EXIT
|
Shell 还支持管道和重定向,例如将一个命令的输出作为另一个命令的输入:
Bash |
---|
| cat file.txt | grep "pattern"
|
awk 和 sed 是两个非常强大的文本处理工具,可以用于处理大量文本数据。
以上是 Shell 脚本的初学者教程,希望能对你有所帮助。如果你想深入了解 Shell,可以参考更详细的文档和书籍。