当前位置: 首页 > 知识库问答 >
问题:

bash - 写一个shell脚本?

洪季萌
2024-06-17

写一个脚本,任意输入一个目录和一个字符串,对输入的字符串进行判断,如果字符串内容等于”ww”,则将该目录下的所有子目录删除,所有子文件拷贝到/var 目录下:如果字符串内容等于”rr”,则在该目录下创建 test1.txt 文件

#!/bin/bashif [ x$1 == x ]then        read -p "请输入一个目录:" direlse                dir=$1firead -p "请输入一个字符串:" str1echo $str1","$dirif [ -d $dir ]then        case $str1 in        "ww")                for file in `ls $dir`                do                        file_path=$dir/$file                        if test -f $file_path                        then                                cp $file_path /var                        elif test -d $file_path                        then                                rm -rf $file_path                        fi                done                ;;        "rr")                cd $dir &&`touch test1.txt`                ;;        *)                echo "未知的输入,请输入rr或ww..."                ;;        esacelse        echo "请输入一个目录..."fi

共有1个答案

蒋英博
2024-06-17

以下是按照您的要求编写的shell脚本,它接收一个目录和一个字符串作为输入,并根据字符串的内容执行相应的操作:

#!/bin/bash# 检查是否提供了目录作为参数if [ -z "$1" ]; then    read -p "请输入一个目录: " direlse    dir="$1"fi# 读取用户输入的字符串read -p "请输入一个字符串: " str1# 打印出输入的字符串和目录echo "$str1,$dir"# 检查目录是否存在if [ -d "$dir" ]; then    case "$str1" in        "ww")            # 遍历目录下的所有文件和子目录            for file in "$dir"/*; do                file_path="$file"                if [ -f "$file_path" ]; then                    # 如果是文件,则拷贝到/var目录                    cp "$file_path" /var/                elif [ -d "$file_path" ]; then                    # 如果是子目录,则删除它                    rm -rf "$file_path"                fi            done            ;;        "rr")            # 如果是"rr",则在目录中创建test1.txt文件            touch "$dir/test1.txt"            ;;        *)            echo "未知的输入,请输入rr或ww..."            ;;    esacelse    echo "请输入一个存在的目录..."fi

请注意,这个脚本有几个潜在的问题和改进点:

  1. 权限问题:直接拷贝文件到/var目录可能需要root权限,如果脚本不是以root用户身份运行,可能会失败。
  2. 错误处理:在删除目录或创建文件时,没有错误处理。例如,如果/var目录已满,则cp命令会失败。
  3. 文件覆盖:如果/var目录下已经存在与源目录中同名的文件,则它们会被覆盖。
  4. 命令执行顺序:在rr的情况下,cd $dir && touch test1.txt可以简化为touch "$dir/test1.txt",因为touch命令可以直接指定文件路径。
  5. 安全性:此脚本没有进行输入验证,可能存在安全风险。在生产环境中使用时,需要更加谨慎地处理用户输入。
  6. 性能:使用lsfor循环可能不是遍历目录的最有效方式,特别是当目录包含大量文件时。使用find命令或其他更高效的工具可能更为合适。

在实际使用中,需要根据具体的场景和需求来调整和完善这个脚本。

 类似资料:
  • 本文向大家介绍写出健壮Bash Shell脚本的一些技巧总结,包括了写出健壮Bash Shell脚本的一些技巧总结的使用技巧和注意事项,需要的朋友参考一下 许多人用Shell脚本完成一些简单任务,而且变成了他们生命的一部分。不幸的是,shell脚本在运行异常时会受到非常大的影响。在写脚本时将这类问题最小化是十分必要的。本文中我将介绍一些让bash脚本变得健壮的技术。 使用set -u 你因为没有对

  • 第一个shell脚本 编写 打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。 输入一些代码,第一行一般是这样: #!/bin/bash #!/usr/bin/php “#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。 运行 运行Shell脚本有两种方法: 作为可执行程序

  • 问题内容: 我正在尝试为变量分配数组长度。 它说找不到len命令。为什么? 问题答案: 变量名和赋值运算符之间不能有空格。如果这样做,会将变量名称视为命令。 尝试:

  • 问题内容: 我想从下面的程序中运行一个shell脚本,但它似乎无能为力。我已经直接在linux终端中运行了相同的命令,它运行正常,所以我猜这是我的Java代码。如您所见,我首先使用PrintWriter将命令写入Shell脚本,但我希望这不会影响Shell脚本本身的运行。任何帮助,将不胜感激! 问题答案: 您应该使用返回的结果。 将命令作为单独的进程执行,并返回类型为的对象。您应该调用以便程序等待

  • 我在尝试编译 eXo 平台时遇到麻烦。 错误消息是: < code >原因:java.io.IOException:无法运行程序“/exo/platform-public-distributions-develop/PLF-community-Tomcat-standalone/target/platform-community-5.0 . x-SNAPSHOT/platform-communit

  • 问题内容: 我正在尝试编写一个bash shell脚本,该脚本在用户定义的时间内消耗嵌入式设备上的大量RAM。不使用数组怎么办? 问题答案: 即使不支持传统的Bash数组,也仍然可以使用特定Shell中内置的命令来创建类似数组的变量。 以下示例脚本基于我在嵌入式Linux项目中使用BusyBox时执行的一些脚本。 BusyBox使用Almquist Shell (也称为A Shell,ash和sh