加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

除了某些文件之外,这个bash函数如何工作?

发布时间:2020-12-15 21:50:42 所属栏目:安全 来源:网络整理
导读:我在 commandlinefu.com上找到了以下脚本(该示例不再在线): rmbut() { local x=("$@") IFS=,rm -rf *[!"${x[*]}"] } 它删除所有文件和目录,但删除命令行上命名的文件和目录. 你能解释一下: 第一行发生了什么? $@表示所有参数,但为什么它放在括号内? 我读
我在 commandlinefu.com上找到了以下脚本(该示例不再在线):

rmbut() { 
    local x=("$@")
    IFS=,rm -rf *[!"${x[*]}"] 
}

它删除所有文件和目录,但删除命令行上命名的文件和目录.

你能解释一下:

>第一行发生了什么? $@表示所有参数,但为什么它放在括号内?
>我读过IFS但从未真正使用过它,它的用法是什么?
> * [!“${x [*]}”]取得了什么成果?我无法理解如何将它分成我知道的东西.

解决方法

local x =(“$@”)创建一个数组,它是所有参数的副本($@本身就是一个数组).

IFS =,将内部字段分隔符设置为逗号.

IFS =,rm -rf * [!“${x [*]}”]表示删除所有不以任何作为参数传递的字符结尾的文件.由于*用作数组的索引并且引用变量,因此它将扩展为单个字符串,并且通常将数组元素分隔的空格将替换为IFS的内容(在本例中为逗号).

rmbut a b c

解析为rm -rf * [!a,b,c],它也不会删除以逗号结尾的文件.

我认为该功能可以简化为:

rmbut() { 
    IFS= rm -rf *[!"$*"] 
}

但它的行为会略有不同.此版本将IFS设置为null,因此上面的示例将解析为rm -rf * [!abc],这将删除以逗号结尾的文件(逗号必须作为参数显式传递以保留此类文件).但是,可以通过设置IFS =来返回该行为,(根本不需要复制数组).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读