在shell脚本中转​​义变量中的双引号

时间:2014-09-24 05:53:07

标签: macos shell unix terminal

希望是一个简单的问题和我的谜题中的最后一块...... :-)我在os x下的终端中运行了一个shell脚本。它包含其他内容:

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

...这很好......但是让我们说文件名包含双引号 - IMA" G09%' 27.jpg - 然后输出将是:

" IMA" G09%' 27.jpg;"

......那会"打破"我的行打算稍后放入db(双引号)。所以我需要逃避它,所以我得到输出:

" 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

2 个答案:

答案 0 :(得分:2)

printf%q一起使用:

name='file"naeme.txt'

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

答案 1 :(得分:0)

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

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

printquoted "$name"
printquoted "$full_path"
printquoted "$extension"
...etc

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

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