我正在尝试将文件命令的输出分配basename
给变量“filename”。paths
是一个包含路径位置的文件,例如/root/home/david/mynote
$FILE
is = mynote
.grep
是获取完整路径/root/home/david/mynote
,
basename
是仅提取mynote
并将其分配给变量filename
。
filename=basename `grep $FILE House/paths`
使用上述命令行,当我输入时,的值filename
始终为空
echo $filename
。
答案1
通常,在 BASH 中,您可以通过以下方式之一将命令的输出保存到变量中:
foo=$(ls /usr)
或者
foo=`ls /usr`
至于您的问题,如果您有一个名为的文件,foo.txt
其内容如下:
/usr/
/usr/games
/usr/games/cowthink
/usr/games/cowsay
/usr/games/fortune
/usr/games/enemylines7
/usr/games/enemylines3
/usr/lib32
/usr/lib32/libgdbm_compat.so.3.0.0
/usr/lib32/libfusion-1.2.so.9.0.1
那么这应该可以满足您的需要:
while read FILE; do filename=`basename "$FILE"`; echo "$filename"; done < foo.txt
相反,如果您想在文件中搜索特定模式(例如“mynote”),请执行以下操作:
grep mynote foo.txt|while read FILE; do filename=`basename "$FILE"`; echo "$filename"; done
解释:
while read FILE; do {something}; done < foo.txt
此命令读取文件的每一行foo.txt
并将其内容保存到变量中$FILE
。然后{something}
对文件的每一行执行一次。
在这种情况下,{something}
是这个命令:
filename=`basename "$FILE"`; echo "$filename"
它首先basename
对变量的内容进行运行$FILE
,并将结果保存在变量中$filename
。请注意 周围的引号 ( "
) $FILE
,它们确保该命令适用于包含空格的文件名。最后,它用于echo
打印 的内容$filename
。
更新:
看到你的其他问题,我明白你想做什么。你需要的是:
filename=$(basename `grep $FILE CourseWork/paths`)
答案2
这是一个完美的例子,说明了为什么你应该停止在 bash 中使用已弃用的反引号语法:
filename=$(basename $(grep $FILE House/paths))
看http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution
请注意,为了防止路径可能包含空格,请将某些项目括在双引号中:
filename=$(basename "$(grep "$FILE" House/paths)")
变量为空的原因是:当 shell 看到
filename=basename `grep $FILE House/paths`
- shell 首先执行 grep 命令(假设该命令返回“/foo/bar/myfile”)
- 然后 shell 尝试执行“/foo/bar/myfile”,暂时地
filename
使用命令执行期间的值设置环境变量baseline
——shell才不是包含一个filename
变量。
这在 bash 参考中有记录环境
任何简单命令或函数的环境都可以通过在其前面添加参数赋值来临时增强,如Shell 参数。这些赋值语句只影响该命令所看到的环境。