V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
plko345
V2EX  ›  Linux

心好痛,验证脚本的时候真的不要在实体机上操作

  •  
  •   plko345 · 2018-04-20 17:03:16 +08:00 · 5031 次点击
    这是一个创建于 2400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想把一个目录下的所有文件的名称里的某个字符给删掉,刚写好一个功能实验了下,指定了目录,结果没想到脚本去操作指定目录以外的其它目录了,都不知道为什么,还好没用 root,要不后果不堪设想,到现在也不知道原因何在

    我指定了的目录是 /home/mh/Document/test,结果还把 /home/mh/下其它目录也扫了一遍,但不知道有没有文件被修改,估计是有了,我用的字符是"es",应该比较常见,求大大帮我看看,顺便问问有没有办法反向来一套复原的操作

    这是脚本

    #!/bin/bash                                                                                                                                                                                   
    PWD=$(pwd)
               
    # 校正输入 
    invalid_input () {
        printf "\e[41m\e[30mInvalid input '$REPLY'\e[0m\n" >&2 
        exit 1 
    }          
               
               
    # 删除字符串并重命名
    delWord () {
        echo del
                
        for i in $(ls);do
            if [ -f $PWD/$i ];then
                rename $str '' $(pwd)/$i
                echo "good job"
            elif [ -d $PWD/$i ];then
                (cd $PWD/$i;delWord)
            fi  
        done   
        printf "\e[42m\e[30mDone!\e[0m\n"
               
    }          
                
    # 添加字符串并重命名
    addWord () {
        echo add
                
    }           
                
    # 输入文件所在目录
    read -p "Enter a path: " workpath
    if [[ ! -d $workpath ]];then
        printf "\e[42m\e[31mError: Enter a valid path, try again.\e[0m\n"
        exit 2 
    fi          
                
    # 输入添加 /删除的字符串
    read -p "Enter a String > " str 
    # str 中是否含有非法字符
    if [[ $str =~ [^_-.[:alnum:]] ]] || [[ $str =~ ^[[:digit:]] ]];then
        invalid_input
    fi
     
    # 选择添加 /删除操作
    read -p "Delete or add a string?(1.del 2.add): "
     
     
    if [[ $REPLY -eq 1 ]];then
        set -x
        cd $wordpath
        delWord $str
        set +x
    elif [[ $REPLY -eq 2 ]];then
        addWord
    else
        invalid_input
    fi
    

    这是部分输出结果,太多了只贴一部分,前面有好多终端拉不上去了看不到,也不知道处理了目标目录后它怎么干的,应该重定向到文本里的,唉!

    ......
    + cd linux
    + delWord
    + echo del
    del
    ++ ls
    + for i in $(ls)
    + '[' -f /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86 ']'
    + '[' -d /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86 ']'
    + cd x86
    + delWord
    + echo del
    del
    ++ ls
    + for i in $(ls)
    + '[' -f /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86/libpty.so ']'
    + rename es '' /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86/libpty.so
    + echo 'good job'
    good job
    + printf '\e[42m\e[30mDone!\e[0m\n'
    Done!
    ....
    
    24 条回复    2018-04-21 20:18:34 +08:00
    plko345
        1
    plko345  
    OP
       2018-04-20 17:04:11 +08:00
    对了,写的兴起,所以加了点不必要的功能,不要在意
    est
        2
    est  
       2018-04-20 17:09:47 +08:00
    chmod -R 000 /
    lmqdlr
        3
    lmqdlr  
       2018-04-20 17:26:38 +08:00 via Android
    想起来当年 bumblebee 的事故了
    plko345
        4
    plko345  
    OP
       2018-04-20 17:27:35 +08:00
    @lmqdlr 兄弟说出来让我开心下,而且我这个脚本都指定目录了想着没问题的,没想到....
    crazyvv
        5
    crazyvv  
       2018-04-20 17:31:43 +08:00
    请问您是在哪个目录执行的这个脚本?
    Ziya
        6
    Ziya  
       2018-04-20 17:38:03 +08:00
    @plko345 就是那个「 rm -rf /」
    plko345
        7
    plko345  
    OP
       2018-04-20 17:39:49 +08:00
    @crazyvv 我的目标目录是 /home/mh/Document/test 目录,我运行脚本的目录在 /home/mh/Document 目录
    plko345
        8
    plko345  
    OP
       2018-04-20 17:41:00 +08:00
    @crazyvv 这才是最诡异的地方 TAT
    lmqdlr
        9
    lmqdlr  
       2018-04-20 17:56:39 +08:00 via Android
    @plko345 bumblebee 一段脚本多了个空格,把 /usr 干掉了
    yrom
        10
    yrom  
       2018-04-20 18:06:41 +08:00
    你的一个变量拼错了

    cd $wordpath
    delWord $str

    应该是 $workpath

    ╮(╯_╰)╭
    plko345
        11
    plko345  
    OP
       2018-04-20 18:11:01 +08:00
    @yrom 我 X,还真是,谢谢,可是为什么会从家目录开始呢,而不是当前运行脚本的目录,我明明是在 Document 目录下运行的啊
    momocraft
        12
    momocraft  
       2018-04-20 18:12:14 +08:00
    有点辣眼睛 没看完

    几个小建议:

    - set -ue
    - 加一个 dryrun 模式
    - read 有不少坑,不如从命令行参数传进来
    Azumo
        13
    Azumo  
       2018-04-20 18:19:59 +08:00
    想起刚玩 Linux 时在根目录迭代 sudo rm -rf /
    mentalkiller
        14
    mentalkiller  
       2018-04-20 18:30:55 +08:00
    ```shell
    alias rm=trash

    trash(){
    t=$(date +%Y%m%d%H%M%S)
    mv $@ /path/to/.trash/$@_$t
    }
    ```
    plko345
        15
    plko345  
    OP
       2018-04-20 18:33:27 +08:00
    @momocraft set -e 我是想基本完成后再加的,read 的只是一时兴起加上去玩玩的,本来就函数里边的功能就完成了,无聊多写了些
    yorks
        16
    yorks  
       2018-04-20 18:33:43 +08:00   ❤️ 1
    @plko345
    cd
    已经回到 家里了。。。
    menghuan
        17
    menghuan  
       2018-04-20 18:34:24 +08:00
    出过类似事故 rm 时候变量未定义就从家目录开始删
    plko345
        18
    plko345  
    OP
       2018-04-20 18:35:57 +08:00
    @momocraft dryrun 模式是什么?
    Arnie97
        19
    Arnie97  
       2018-04-20 18:38:32 +08:00 via Android
    @plko345 测试模式,只打印将要进行的操作列表,不进行任何实际操作
    plko345
        20
    plko345  
    OP
       2018-04-20 18:43:54 +08:00
    @Arnie97 谢谢,请问命令是哪个?从来没有用过
    doubleflower
        21
    doubleflower  
       2018-04-20 19:16:36 +08:00
    写脚本 -e 一定要啊,不然中间操作错了会一路错下去,发生什么事都可能
    afpro
        22
    afpro  
       2018-04-21 11:10:59 +08:00
    PWD 会随着目录变化而变化的 运行一半就已经不是你开始的 PWD=$(pwd)了吧。。。。。。
    plko345
        23
    plko345  
    OP
       2018-04-21 12:11:25 +08:00 via Android
    @afpro 后来运行时也发现了,改过了
    szlszl35622
        24
    szlszl35622  
       2018-04-21 20:18:34 +08:00
    我一般都是在腾讯云的学生鸡上面测试脚本,,
    出错直接重装系统
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1177 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.