【问题标题】:Escaping double quotes in a variable in a shell script在 shell 脚本中的变量中转义双引号
【发布时间】:2014-09-24 05:53:07
【问题描述】:

希望是一个简单的问题,也是我拼图中的最后一块...... :-) 我有一个 shell 脚本在 os x 下的终端中运行。其中包括:

name=$(basename "$file")
printf "%s" "\"$name\";"

...这很好...但是假设文件名包含双引号 - IMA"G09%'27.jpg - 那么输出将是:

"IMA"G09%'27.jpg;"

... 这将“破坏”我打算稍后放入数据库的行(双引号)。所以我需要转义它才能得到输出:

"IMA\"G09%'27.jpg;"

...但我不知道怎么...有人? :-)

编辑 - 结果:在 anubhava 的帮助下,这是我使用的(获取文件信息,包括类型/创建者):

#!/bin/bash

find . -type f -name '*' -print0 | while IFS= read -r -d '' file
do
    name=$(basename "$file")
    path=$(dirname "$file")
    # full_path=$(readlink -f "$file") # This only works on Linux
    full_path=$(echo "$PWD/${file#./}")
    extension=${name##*.}
    size_human_readable=$(ls -lh "$file" | awk -F' ' '{print $5}')
    size_in_bytes=$(stat -f "%z" "$file")
    creation_date=$(stat -f "%SB" "$file")
    last_access=$(stat -f "%Sa" "$file")
    last_modification=$(stat -f "%Sm" "$file")
    last_change=$(stat -f "%Sc" "$file")
    creator=$(mdls -name kMDItemFSCreatorCode "$file")


    printf "\"%q\";" "$name"
    printf "%s" "\"$full_path\";"
    printf "%s" "\"$extension\";"
    printf "\"$size_human_readable\";"
    printf "\"$size_in_bytes\";"
    printf "\"$last_modification\";"
    printf "%s" "\"$creator\""
    printf "\n"
done

【问题讨论】:

    标签: macos shell unix terminal


    【解决方案1】:

    printf%q 一起使用:

    name='file"naeme.txt'
    
    printf "\"%q;\"" "$name"
    "file\"naeme.txt;"
    

    【讨论】:

    • 更改了 printf "%s" "\"$name\";"到 printf "%s\"%q;\"" "\"$name\";" ...但仍然得到相同的输出,即。 "file"name.txt;" ... 因为我将它与 "%s" 结合使用?但我需要它,否则名称包含 % 的文件将被跳过。
    • 您需要在问题中提供更多%q 不适合您的示例。
    • 嗯,你说得对,可以使用 % ... 但是 ... 我需要整个字符串周围的双引号未转义,而这些现在也被转义: printf "\"%q; \"" "\"$名称\";"给我"\"IMA\"G09%\'27.jpg\"\;
    • 啊,但是我当然可以分 3 步完成 printf!谢谢,知道了 - 稍后会发布最终结果 :-) 感谢您的帮助! :-)
    • 试试这个命令:s="IMA\"G09%'27.jpg" && printf "\"%q;\"" "$s"。它给了我:"IMA\"G09%\'27.jpg;" 正如您所看到的,外部引号未转义。
    【解决方案2】:

    这是另一种方法,使用sed来控制转义:

    printquoted() {
        printf '"%s";' "$(LC_ALL=C sed 's/["]/\\&/g' <<<"$1")"
    }
    
    printquoted "$name"
    printquoted "$full_path"
    printquoted "$extension"
    ...etc
    

    如果事实证明除了双引号之外还有其他需要转义的内容(例如,反斜杠本身),您可以将它们添加到 sed [] 表达式中(例如 ["\] 会转义双引号 -引号和反斜杠)。

    请注意,如果字符串包含任何换行符(这在文件名中是合法的),这种方法将非常失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多