在 Linux 脚本中为变量分配值或字符串

在 Linux 脚本中为变量分配值或字符串

我正在尝试将文件命令的输出分配basename给变量“filename”。paths是一个包含路径位置的文件,例如/root/home/david/mynote

$FILEis = mynote.grep是获取完整路径/root/home/david/mynotebasename是仅提取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`
  1. shell 首先执行 grep 命令(假设该命令返回“/foo/bar/myfile”)
  2. 然后 shell 尝试执行“/foo/bar/myfile”,暂时地filename使用命令执行期间的值设置环境变量baseline——shell才不是包含一个filename变量。

这在 bash 参考中有记录环境

任何简单命令或函数的环境都可以通过在其前面添加参数赋值来临时增强,如Shell 参数。这些赋值语句只影响该命令所看到的环境。

相关内容