Linux:双引号变量和文件循环


0

在另一个问题中,我被建议在我的脚本中“双引用$ variables”以避免错误。

在阅读了大量关于双引号的信息之后,我认为当我需要(例如)循环文件时我可以/必须从双引号中排除通配符,但我想确定。

如果以下两种用法都正确使用双引号,你能告诉我吗?

for file in "$workingdir"/*; do
  #do something with $file
done

if [[ $workingdir == $variable* ]]; then
  #do something
fi

对于我在我的测试中看到的那样,使用"$workingdir/*"设置变量file$workingdir/*这不是我想要的。

谢谢。

问候


对于给定的文件,是否有任何关于应该发生什么以及实际发生的例子?
Xen2050

实际上,我想要的是:我对代码没有任何问题。我想确定这是正确的方法,因为我仍然不太熟悉在变量周围使用双引号。
lennelei

那么,尝试使用具有空格和换行符的变量(文件名在这里?),然后看看会发生什么,引用通常可以避免这些问题。可能想引用[[/ test too
Xen2050

Answers:


0

你给出的第一个例子是正确的(假设它意味着明显的事情):

for file in "$workingdir"/*; do

这将迭代目录中与变量值对应的文件列表,workingdir即使包含空格或其他有趣字符也能正常工作。

但是,第二个例子更复杂:

if [[ $workingdir == $variable* ]]; then

在这种情况下,变量的值variable将被视为模式,而不是固定的字符串。例如,如果variable设置为“* foo”,则如果$workingdir在其值的任何位置包含“foo” ,则整体条件将匹配。如果你想$variable被视为文字字符串而不是模式,你又必须把它放在双引号中(但不是*,假设你希望被视为通配符):

if [[ $workingdir == "$variable"* ]]; then

......坦率地说,跟踪双引号变量的重要性和不重要的地方比它的价值更麻烦。(即将它们放在左侧===内侧[[ ]]- 但不是右侧或内侧是安全的[ ])。所以我只是建议在任何地方引用它们,这样你就不必保持这样的密切关注:

if [[ "$workingdir" == "$variable"* ]]; then

0

文件名扩展是在分完成的(这是双引号的内容......)。

所以"$mydir"/*扩展到"my directory"/*变量置换后,然后到my directory/*字分割后(作为单个字),然后到my directory/file1my directory/file2文件名扩展后。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.