执行shell脚本复制父目录内容到子目录时报错如何解决
错误原因
- 第一个括号语法错误的核心原因:你脚本首行指定的是
/bin/sh,而extglob扩展通配符是Bash的独有特性,绝大多数系统的/bin/sh不支持该语法,自然识别不了!()的通配符格式,直接抛出语法异常。 - 第二个文件不存在的错误:你给
../!(sub_dir)加了单引号,shell会把它当成普通字符串处理,不会触发通配符展开,自然找不到字面名称为!(sub_dir)的文件。
解决方法
方法1:切换为Bash解释器使用extglob特性
如果可以依赖Bash环境,直接修改脚本内容如下即可:
#!/bin/bash # 先切换到父目录避免相对路径匹配出错 cd .. mkdir sub_dir # 开启扩展通配符 shopt -s extglob # 排除sub_dir本身,复制其余所有内容到sub_dir cp -r !(sub_dir) sub_dir/
方法2:使用兼容sh的find命令实现
如果需要兼容sh环境、不想依赖Bash独有特性,可以用find命令实现相同逻辑:
#!/bin/sh mkdir ../sub_dir # 遍历父目录下的直接子文件/目录,排除sub_dir后复制到目标路径 find .. -maxdepth 1 -mindepth 1 ! -name 'sub_dir' -exec cp -r {} ../sub_dir/ \;
注意事项
- 脚本首行的
#!解释器声明要和使用的语法匹配,用到Bash特性就必须写#!/bin/bash,不能写/bin/sh - 需要shell做通配符展开时,不要给匹配规则加单/双引号,加引号会让通配符被识别为普通字符。
内容的提问来源于stack exchange,提问作者disp_name
相关产品推荐
相关产品推荐

