Unix 如何将 fuser 命令输出存储到变量
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
.
然后在暂存中加载数据后 table 再次将文件重命名为我们收到的旧文件名,然后使用其原始名称存档文件。
您的问题是缺少结束单引号:
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
个字符的模式] -- 这可能是你想要的,但它可能会根据 ??????????????
)
的可能性以更简洁的方式编写
虽然 fuser
会报错,但您可能还想养成 验证 的习惯,通过测试 [=17] 您的命令替换是否返回变量=] 在调用 fuser
后为空,例如
#!/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
检查一下,如果您还有其他问题,请告诉我。
我是脚本新手,我遇到了这个问题:
我想使用 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
.
然后在暂存中加载数据后 table 再次将文件重命名为我们收到的旧文件名,然后使用其原始名称存档文件。
您的问题是缺少结束单引号:
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
个字符的模式] -- 这可能是你想要的,但它可能会根据 ??????????????
)
虽然 fuser
会报错,但您可能还想养成 验证 的习惯,通过测试 [=17] 您的命令替换是否返回变量=] 在调用 fuser
后为空,例如
#!/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
检查一下,如果您还有其他问题,请告诉我。