跳转至

Shell

一、Shell 脚本入门

Shell 脚本是一种为了完成特定任务而编写的程序,它可以在 Unix/Linux 系统上运行。脚本文件通常以 .sh 结尾,并且需要有执行权限才能运行。

例如下面是一个简单的 Shell 脚本:

Bash
1
2
3
#!/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
name="John"
age=20

变量名只能由字母、数字和下划线组成,不能以数字开头。

引用变量可以使用 $ 符号,例如:

Bash
echo "My name is $name and I am $age years old."

上面的代码打印了一个句子,其中 $name$age 将被替换为定义的变量值。

需要注意的是,如果变量值中包含空格或特殊字符,需要使用引号来包裹变量名。例如:

Bash
1
2
3
GREETING="Hello, World!"
echo $GREETING    # 输出 Hello, World!
echo "$GREETING"  # 输出 Hello, World!

Shell 还内置了许多对字符串操作的函数,例如:

  • ${#string}:获取字符串长度。
  • ${string:position:length}:截取字符串。
  • ${string/search/replace}:替换字符串中的文本。

例如:

Bash
1
2
3
4
str="hello world"
echo ${#str}                # 输出 11
echo ${str:0:5}             # 输出 hello
echo ${str/world/earth}     # 输出 hello earth

三、条件判断和循环控制

Shell 脚本可以进行条件判断和循环控制。

if-else 语句可以按照条件分支来执行不同的命令:

Bash
1
2
3
4
5
if [ "$name" == "John" ]; then
    echo "Hello John!"
else
    echo "Hello stranger!"
fi

case 语句可以根据不同的情况执行不同的命令:

Bash
1
2
3
4
5
6
7
8
case "$name" in
    John)
        echo "Hello John!"
        ;;
    *)
        echo "Hello stranger!"
        ;;
esac

while 循环可以在条件满足时一直执行某个命令:

Bash
1
2
3
4
5
n=1
while [ $n -le 10 ]; do
    echo "$n"
    n=$((n+1))
done

for 循环可以遍历一个列表或者数字范围:

Bash
1
2
3
4
5
6
7
8
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
1
2
3
4
5
6
function_name() {
    command1
    command2
    # ...
    return value
}

调用函数的语法如下:

Bash
function_name arg1 arg2 ...

其中 arg1 arg2 等为传递给函数的参数。

例如:

Bash
1
2
3
4
5
function say_hello() {
    echo "Hello, $1!"
}

say_hello "John"    # 输出 Hello, John!

命令行参数可以使用 $1$2$3 等变量来引用。例如:

Bash
1
2
3
4
echo "First argument: $1"
echo "Second argument: $2"
echo "All arguments: $@"
echo "Number of arguments: $#"

如果将上面的代码保存为脚本文件 example.sh,并执行 ./example.sh hello world,则输出结果为:

Text Only
1
2
3
4
First argument: hello
Second argument: world
All arguments: hello world
Number of arguments: 2

五、Shell 文件操作

Shell 脚本可以对文件进行读写、复制、移动、删除和权限控制等操作。

读取文件内容可以使用 cat 命令:

Bash
cat file.txt

复制文件可以使用 cp 命令:

Bash
cp file.txt file_backup.txt

移动文件可以使用 mv 命令:

Bash
mv file_backup.txt ../backup/file.txt

删除文件可以使用 rm 命令:

Bash
rm file_backup.txt

修改文件权限可以使用 chmod 命令:

Bash
chmod +x script.sh    # 赋予执行权限
chmod 644 file.txt   # 修改文件权限为 644

六、Shell 数组和集合操作

Shell 支持数组操作,可以通过下标访问数组元素:

Bash
1
2
3
4
5
6
7
8
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
1
2
3
4
5
6
str="hello world"
if [[ $str =~ ^he ]]; then
    echo "Matched"
else
    echo "Not matched"
fi

上面的代码会输出 Matched。

八、Shell 高级主题

Shell 还有许多高级特性,例如调试、进程管理、信号处理、管道和重定向、awk 和 sed 等工具的使用等。

调试脚本可以使用 set 命令:

Bash
1
2
3
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,可以参考更详细的文档和书籍。