实例1:
# 编写一个shell脚本实现以下需求:
# 执行脚本,当前目录下创建一个名为test的目录,
# 然后在新建的test目录下创建3个文件夹分别命名为case1~case3,在每个文件下创建一个log.txt文件
# 编写一个shell脚本实现以下需求:
# 执行脚本,当前目录下创建一个名为test的目录,
# 然后在新建的test目录下创建3个文件夹分别命名为case1~case3,在每个文件下创建一个log.txt文件# 需要注意的是,这个脚本使用了相对路径,因此必须从脚本所在的目录中执行。
# 如果要在其他目录中执行,可能需要使用绝对路径或者调整代码。
# 此外,如果目录或文件已存在,会报错。
# 因此在实际应用中可能需要加上一些错误处理的逻辑,以确保程序能够正常执行。#!/bin/bash
# 这个脚本可以分为三个部分:
# 1.判断 test 目录是否存在,如果存在则删除
if [ -d "test" ]; thenrm -rf testecho "delete dir test"echo
fi# 2. 在当前目录下创建 `test` 目录。
echo "create dir test"
mkdir test# 3. 使用 `for` 循环语句创建 `case1`、`case2`、`case3` 三个目录,并在每个目录下创建一个 `log.txt` 文件。
# - `for i in {1..3}; do ... done` 表示循环 3 次,每次循环的 `i` 取值为 `1`、`2`、`3`。
# - `mkdir test/case$i` 表示在 `test` 目录下创建名为 `case1`、`case2`、`case3` 的目录。
# - `touch test/case$i/log.txt` 表示在 `case1`、`case2`、`case3` 目录下创建名为 `log.txt` 的文件。
for i in {1..3}; domkdir test/case$itouch test/case$i/log.txt
done
实例2: 通过函数的形式实现文件目录创建,并通过对函数输入参数设置创建问价目录的个数
# 通过函数的形式实现文件目录创建,并通过对函数输入参数设置创建问价目录的个数#!/bin/bash
# 创建 test 目录和子目录
function create_test_dir() {# `local` 命令可以声明局部变量# `local num=$1` 的意思是将传入 `create_test_dir` 函数的第一个参数(即常见文件目录 case 的个数)赋值给局部变量 `num`。# 这个变量只在这个函数中有效,在函数外无法访问。# 使用局部变量可以避免命名冲突,提高代码的可维护性和可读性。# 需要注意的是,`local` 命令是 Bash 内置的命令,不是所有的 shell 都支持。local num=$1# `-d` 是一种测试条件,用于判断给定的路径是否是一个目录(directory)# 如果当前目录中存在名为 `test` 的目录,则执行 `then` 后面的删除命令。# 如果 `test` 目录不存在,则不执行 `then` 后面的删除命令。if [ -d "test" ]; thenrm -rf testecho "delete dir test"fiecho "create dir test"mkdir test# `seq` 是一个用于生成序列的命令,`seq 1 $num` 的意思是生成从 1 到 `$num` 的数字序列,用空格隔开。# 例如,如果 `$num` 为 3,那么 `$(seq 1 $num)` 的结果就是 `1 2 3`。# `for i in $(seq 1 $num); do` 表示 for 循环,# 将 `$(seq 1 $num)` 的结果分别赋值给变量 `i`,循环执行接下来的语句,直到序列中的所有数字都被处理完。for i in $(seq 1 $num); domkdir test/case$itouch test/case$i/log.txtdone
}# 主函数
function main()
{local num_case=5create_test_dir $num_case
}# 调用主函数
main
实例3:通过输入参数的形式指定创建目录以及文件个数
# 通过命令行的形式输入参数,设置创建文件目录以及文件个数
# 不需要输出提示信息,直接执行脚本时输入参数即可:#!/bin/bash
function create_test_dir() {local num=$1if [ -d "test" ]; thenrm -rf testfimkdir test for i in $(seq 1 $num); domkdir test/case$itouch test/case$i/log.txtdone
}function main()
{# `$1` 是外部调用`main` 函数中传递的第一个参数,并将其传递给 `create_test_dir` 函数作为其第1个参数,create_test_dir $1
}# 在这个例子中,`"$@"` 表示将所有从命令行输入的参数传递给 `main` 函数。
# 具体来说,当我们在执行脚本时在命令后面加上参数时,这些参数都会被传递给 `$@` 数组变量。
# `"$@"` 可以将数组中的所有元素拆分成一个个字符串,并将它们作为单独的参数传递给函数。
# 因此,在本例中,`"$@"` 将所有命令行输入的参数作为 `$1, $2, $3` 等参数传递给 `main` 函数,
# 并确保 `main` 函数可以将这些命令行输入的参数传递给 `create_test_dir` 函数,以便正确地执行脚本中需要的计算任务。
# 换句话说,`"$@"` 是一个特殊的变量,它帮助我们捕获并处理在运行脚本时传递给脚本的任何输入参数。
# 在这个例子中,使用 `"$@"` 可以确保我们可以在执行脚本时传递给脚本任意数量的参数,并将它们正确地传递到函数中去,以便执行特定任务或任务流程。main "$@"
实例4:通过提示信息输入参数,根据参数创建目录以及文件个数
# 通过命令行的形式输入参数,设置创建文件目录以及文件个数
# 通过提示信息输入参数#!/bin/bash
function create_test_dir() { if [ -d "test" ]; thenrm -rf testecho "delete dir test"fiecho "create dir test"mkdir test for i in $(seq 1 $1); domkdir test/case$itouch test/case$i/log.txtdone
}function main()
{# `read` 命令用于从标准输入中读取数据,并将输入的数据赋值给变量。# `-p` 参数用于在等待输入时向标准输出打印提示信息。# 用户输入的内容会被赋值给变量 `num`。# 在这里,`-p` 参数会向标准输出打印提示信息 `"Enter the number of test cases: "`。# 也就是说,用户需要按照提示,输入他们期望创建的测试用例的数量。# 然后,`$num` 被传递给 `create_test_dir` 函数,执行创建指定数量的测试用例和测试用例文件的任务。# 因此,这段代码中,`read -p` 命令用于获取用户输入,并且将输入赋值给变量。# 注意提示信息中"num"要与参数$num同名read -p "Enter the number of test cases: " numcreate_test_dir $num
}main