【问题标题】:bash: White-space in filenamesbash:文件名中的空格
【发布时间】:2012-09-21 03:30:07
【问题描述】:

我有一个简单的脚本:

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php $pic;
done

当我的图片名称中有空格时,该脚本将不起作用。我该如何解决这个问题?

如何修复我的脚本以正确处理空白,以及处理其他 JPEG 扩展名,例如“JPG”、“JPEG”、“jpeg”?

【问题讨论】:

  • 尝试"$pic"周围的语音标记。
  • 在遇到空格问题时添加引号
  • 这里不需要分号。

标签: bash


【解决方案1】:

bash 和其他 shell 中的引用规则与 Ruby、Python 和 Perl 等“普通”脚本语言中的引用规则不同,所以一开始这可能会让人感到困惑,但如果你在 $pic 周围加上双引号,bash 会处理变量的内容正确,即使它包含空格。

这一修复将使您的脚本看起来像这样

#!/bin/sh
cd /tmp/pics
for pic in *.jpg;
do
  php -f /tmp/pics/covert.php "$pic";
done

我还会删除每行末尾的分号。仅当您将多条线路挤在一条线上时才需要这些。它们在 bash 中并不像在 PHP 或(在较小程度上)JavaScript 中那样需要。

正如所写,这是使用 Bourne shell 而不是 bash。 (目前我们将忽略 bash 可能会在您的系统上用于模拟 Bourne shell 的事实。)如果您想使用 bash,请更改顶部的“shebang”行。通常是#!/bin/bash

要处理多个文件扩展名,您可以将它们堆叠在一起,中间有空格,就像这样

for pic in *.jpg *.jpeg *.JPEG *.JPG

正如 Jens 所指出的,您可能会遇到奇怪的极端情况,即文件扩展名是大小写混合的。你可以用括号来处理它来分组字符

for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]

或者您可以使用 glenn 的方法来设置您的 shell 选项以忽略大小写(和 non-matching patterns),然后使用更简单的 glob 模式

shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg

如果我们采用后一种方法,最终的脚本将如下所示:

#!/bin/bash
cd /tmp/pics
shopt -s nocaseglob nullglob
for pic in *.jpg *.jpeg
do
  php -f /tmp/pics/covert.php "$pic"
done

希望这会有所帮助!

【讨论】:

  • 双引号,顺便说一句。单引号不适用于参数替换。
  • 在 PHP 中类似,因为它在引用时不会将它们视为文字。但你是对的,你只是在谈论普通的脚本语言。 :)
  • @Jens:是的,我应该澄清一下。在(非计算机相关)美式英语中,“引号”表示双引号,但我认为在英式英语中可能相反,因此大多数英语世界......将修复......跨度>
  • 顺便说一句,如果脚本是 sourced,即使用. scriptsource script,您关于恢复工作目录的观点只是一个问题。直接执行脚本(./script - 这就是您添加 shebang 行的原因),在单独的进程中运行脚本,因此脚本不会在父环境中造成副作用,例如更改当前目录或环境变量。避免采购脚本的好理由。
  • @NedDeily:啊……你是对的。我养成了这个习惯,因为我从我的 .bash_profile 和 .zshrc 中进行了大量采购,所以我可以将内容保存在重点突出的文件中,而不是在一个大的“泥球”文件中保存无数行,但我想这是通常不重要。
【解决方案2】:

对于这样的短脚本,我会使用

#!/bin/sh
cd /tmp/pics
for pic in *.[jJ][pP][gG] *.[jJ][pP][eE][gG]; do
  php -f /tmp/pics/covert.php "$pic"
done

这甚至可以处理像 prettygirl.JpeG 这样奇怪的驼峰式扩展 :-)

【讨论】:

    【解决方案3】:

    使用 bash,进行不区分大小写的文件匹配:

    shopt -s nocaseglob nullglob
    for pic in *{jpg,jpeg}
    do
        php5 -f ./convert.php "$pic"
    done
    

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2010-12-07
      • 1970-01-01
      • 2012-08-08
      • 2014-09-26
      • 2016-11-26
      • 2015-11-13
      • 2018-04-08
      相关资源
      最近更新 更多