【问题标题】:Bash command runs in terminal but not in script fileBash 命令在终端中运行,但不在脚本文件中
【发布时间】:2018-12-03 13:21:09
【问题描述】:

我正在尝试从目录中删除一些文件和文件夹。命令(来自here):

rm -rf !(file_i_don't_want_to_remove|other|other_one)

在终端中运行良好,但如果我尝试在脚本中使用它(使用 vim 创建,2 行):

#!/bin/bash
rm -rf !(one|two)

./file.sh: línea 2: error sintáctico cerca del elemento inesperado `('

翻译:

./file.sh:第 2 行:意外元素 `(' 附近的语法错误

为什么?

PS。我已经寻找了其他同名的问题,但它们对于每个脚本都太具体了,而且似乎与我的问题不同。

【问题讨论】:

  • 只是一个建议,为什么不遍历所有要删除的文件,例如--> .txt.jpg 等并删除它们,只是一个建议。
  • 脚本中的bash 是否与终端中的一样新?我认为您还需要设置shopt -s extglob
  • @RavinderSingh13 可能是递归的,恕我直言,更多行没有优势。
  • @MarkSetchell 我完全不知道。我刚刚找到该命令,在我的终端中尝试过它并且它有效,然后尝试在脚本中使用它。我从来没有使用过shopt 命令,也不知道它有什么作用。打算研究一下。谢谢你的线索。

标签: bash


【解决方案1】:

您需要启用 extglob 扩展才能使此语法起作用:

#!/bin/bash
shopt -s extglob
cd /path/to/dir # See the comment below the answer
rm -rv !(one|two)

PS:不要不要在脚本中使用rm -f

PS:如果/path/to/dir 来自一个变量,请确保它不为空,然后再与cd 一起使用:

if [ -z "${path_to_delete}" ] ; then
    "path_to_delete is empty! Aborting"
    exit 1
fi
cd "${path_to_delete}"
rm -rv !(one|two)

【讨论】:

  • 如果你在一个文件中使用rm -r请确保你首先cd 到正确的目录! 我过去一直被这个问题困扰。感谢 $DIETY 的磁带备份
  • 难以置信的好点!此外,如果/path/to/dir 来自变量,请确保在rm 命令中使用它之前它不为空。
  • 最好是[ -z "${path_to_delete}" ] || [ ! -d "${path_to_delete}" ] 或者只是cd "${path_to_delete}" || exit
  • ! -d 检查根据情况可能是个好主意,但请注意cd "" 将保持工作目录不变并返回0
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2021-02-17
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多