带 ls $variable 的 bash 脚本

标签 bash

我正在尝试让我的脚本以 ls 格式“$variable”中的所有文件。*

参数总是一个扩展名为.001的文件 我想找到所有具有相同名称但不同扩展名的文件,例如 $file.002、file.003 等。例如:

first="$1"
others=${first%.001}
ls $others"*"

我的问题是文件名为 file[success].mpg.001 ls 得到的是 file[success].mpg* 这给了我 ls: 无法访问文件[成功].mpg*: 没有那个文件或目录 因为 ls 需要查看:

file\[success\].mpg*

我一直在尝试一切,我注意到的一件事是 ls 喂参数 $1 有效,但如果在我完成 file=$1 之后喂 $file 则无效。 所以我想我该如何将变量更改为参数?

最佳答案

您可以使用 bashprintf 命令重新格式化字符串。此外,您不需要引用 *:

#!/bin/bash
first="$1"
others=$(printf %q "${first%.001}")
ls $others*

printf %q 以可用作 shell 输入的格式重新格式化字符串(关于 bash 的手册页)。

编辑评论:
上述解决方案不适用于文件名中的空格。对于这些情况(正如已经提到的其他一些答案),最好不要使用 printf 而是正确引用所有变量:

#!/bin/bash
first="$1"
others="${first%.001}"
ls -- "$others"*

关于带 ls $variable 的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859012/

相关文章:

bash - 组合表单和按钮时如何获取YAD中的值//用户指定按钮的退出代码

bash/zsh 脚本行为差异

regex - 将匹配 YYMMDD 但不匹配更长数字的 bash 正则表达式

linux - .bashrc 中的 shopt -s extdebug 在脚本文件中不起作用

bash - errexit和bash中的管道

Windows XP 上的 Git sh.exe 进程 fork 问题,慢吗?

bash - 删除行的第一部分

linux - 首先在客户端本地评估 ssh 远程执行 block 中的指令。为什么?

mysql - 一次对不同的表运行相同的 sql 查询(bash 脚本)

linux - bash - wget -N if else 值检查