0

我是脚本新手,我遇到了这个问题:

我想使用该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'

但是,上面代码的结果是:

-bash-3.00$ script.sh
file_name before :test
FILE_DIR/SD/Test_file_20180823120345.dat
file_name after:

命令的输出没有存储在变量中,而是显示在屏幕上,我不知道为什么!

我想要做的是存储Test_file_20180823120345.datfile_name变量中,然后从中删除时间戳并将文件重命名为Test_file_20180823.dat.

然后在暂存表中加载数据后,再次将文件重命名为我们收到的旧文件名,然后使用原始名称归档文件。

4

1 回答 1

1

您的问题是缺少单引号:

echo 'file_name before: '$file_name

(这也是为什么你必须不平衡echo 'file_name after: '$file_name'最后一行的引号才能让脚本运行)

相反,只需双引号整个字符串echo将允许扩展您的变量file_name,例如

echo "file_name after: $file_name"

此外,避免在命令替换中使用反引号,而是使用以下$(...)形式,例如

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只会匹配带有14字符的模式,Test_file_后面跟着.dat-- 这可能是您想要的,但它可能会根据 的可能性以更简洁的方式编写??????????????

虽然fuser会提供一个错误,但您可能还希望养成通过在调用后测试是否为空来验证您的命令替换是否返回变量的习惯,例如file_namefuser

#!/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

如果您还有其他问题,请仔细查看并告诉我。

于 2018-08-24T04:23:53.473 回答