Bash Unix如何将fuser命令输出存储到变量
我是一个脚本新手,我有一个问题: 我想使用fuser命令检查是否存在具有该名称的文件。我想保存命令的输出,然后在加载之前使用它重命名文件 我尝试了以下方法:Bash Unix如何将fuser命令输出存储到变量,bash,shell,unix,fuser,Bash,Shell,Unix,Fuser,我是一个脚本新手,我有一个问题: 我想使用fuser命令检查是否存在具有该名称的文件。我想保存命令的输出,然后在加载之前使用它重命名文件 我尝试了以下方法: #!/bin/bash file_name='test' echo 'file_name before: '$file_name file_name=`fuser FILE_DIR/SD/Test_file_??????????????.dat` echo 'file_name after: '$file_name' 但是,上述代码的结果
#!/bin/bash
file_name='test'
echo 'file_name before: '$file_name
file_name=`fuser FILE_DIR/SD/Test_file_??????????????.dat`
echo 'file_name after: '$file_name'
但是,上述代码的结果是:
-bash-3.00$ script.sh
file_name before :test
FILE_DIR/SD/Test_file_20180823120345.dat
file_name after:
命令的输出不是存储在变量中,而是显示在屏幕上,我不知道为什么
我要做的是将Test_file_20180823120345.dat存储在file_name变量中,然后从该变量中删除时间戳,并将该文件重命名为Test_file_20180823.dat
然后,在加载暂存表中的数据后,再次将该文件重命名为我们收到的旧文件名,然后用其原始名称存档该文件。您的问题是在以下文件中缺少一个结束单引号:
echo 'file_name before: '$file_name
这也是为什么您必须在最后一行的“$file\u name”后面的echo“file\u name”中不平衡引号才能运行脚本的原因
相反,只需将echo的整个字符串双引号,即可扩展变量文件名,例如
此外,避免使用反勾号替换命令,而是使用$。。。形式,例如
file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)
或者重写它可以是:
#!/bin/bash
file_name='test'
echo "file_name before: $file_name"
file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)
echo "file_name after: $file_name"
注意:与fuser的匹配只会在Test_file_uuu后匹配14个字符的模式,后跟.dat-这可能是您想要的,但它可能会以更干净的方式写入,具体取决于
虽然fuser会提供一个错误,但您可能还希望养成这样的习惯:在调用fuser后,通过测试file_name是否为空来验证命令替换是否返回了一个变量,例如
仔细检查一下,如果您还有其他问题,请告诉我。发布与bash相关的问题时,添加bash标签会有所帮助。posixshell缺少bash中的许多特性,因此如果为shell添加标记,您可能会得到更合适的答案。这个/bin/bash告诉我您实际上使用的是bash而不是posixshell。请阅读-总结是,这不是一种理想的解决志愿者问题的方法,并且可能会对获得答案产生反作用。请不要将此添加到您的问题中。嗨,大卫,谢谢您的回复。。。但是,当我把fuser命令放在括号中时,我得到了非法的变量名error是否还有其他命令可以找到具有特定模式的文件并将其存储在变量中。谢谢David,我的工作完成了。我用的是find而不是fuser。再次感谢您的回复和时间,很高兴能提供帮助。对不起,我错过了你之前的评论。寻找是一个很好的方法。祝你的脚本编写工作好运。
#!/bin/bash
file_name='test'
echo "file_name before: $file_name"
file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)
echo "file_name after: $file_name"
#!/bin/bash
file_name='test'
echo "file_name before: $file_name"
file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)
if [ -z "$file_name" ]; then
echo "error: no file matched pattern" >&2
else
echo "file_name after: $file_name"
fi