繁体   English   中英

Unix如何将融合命令输出存储到变量

[英]Unix how to store fuser command output to a variable

我是脚本编写的新手,因此遇到以下问题:

我想使用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.dat存储在file_name变量中,然后从中删除时间戳并将文件重命名为Test_file_20180823.dat

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

您的问题是:

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的匹配将仅与Test_file_后跟.dat 14字符的模式匹配-这可能是您想要的,但是根据??????????????的可能性,可以用更Test_file_方式编写它??????????????

尽管fuser将提供错误,但您可能还想养成一种习惯,即通过在调用fuser之后测试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

仔细检查一下,如果您还有其他问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM