我正在尝试让我的脚本以"$ variable"形式显示所有文件.*
参数总是一个扩展名为.001的文件我想查找所有具有相同名称但扩展名不同的文件,例如$ file.002,file.003等.例如:
first="$1"
others=${first%.001}
ls $others"*"
Run Code Online (Sandbox Code Playgroud)
我的问题是文件被命名file[success].mpg.001
,什么被送到ls是file[success].mpg*给了我,
ls: cannot access file[success].mpg*: No such file or directory
因为ls需要看到:
file\[success\].mpg*
Run Code Online (Sandbox Code Playgroud)
我一直在尝试所有的东西,我注意到的一件事就是输入$ 1参数,但是如果我在完成file = $ 1之后输入$ file则没有.所以我想如何将变量更改为参数?
您可以使用bash's printf命令重新格式化字符串.此外,您不需要引用*:
#!/bin/bash
first="$1"
others=$(printf %q "${first%.001}")
ls $others*
Run Code Online (Sandbox Code Playgroud)
printf %q以可用作shell输入的格式重新格式化字符串(关于bash手册页).
编辑评论:
上述解决方案不适用于文件名中的空格.对于那些情况(如已经提到的其他一些答案),最好不要使用printf但是要正确引用所有变量:
#!/bin/bash
first="$1"
others="${first%.001}"
ls -- "$others"*
Run Code Online (Sandbox Code Playgroud)
你应该引用变量,而不是通配符:
ls -- "$others"*
Run Code Online (Sandbox Code Playgroud)
双短划线停止搜索选项,以便即使others以短划线开头,此代码也应该起作用.
请注意,ls脚本中的错误解决方案通常不是.仅在您确实要打印列表时使用它,例如以长格式:
ls -l -- "$others"*
Run Code Online (Sandbox Code Playgroud)
如果您只想打印名称,则根本不需要ls:
echo "$others"*
Run Code Online (Sandbox Code Playgroud)
不幸的是你不能使用--带echo.但是,如果您想要一个文件名数组,请使用
filenames=("$others"*)
Run Code Online (Sandbox Code Playgroud)
如果你想迭代它们,请使用
for filename in "$others"*
Run Code Online (Sandbox Code Playgroud)