我在这里回答了一个问题: https://unix.stackexchange.com/questions/264925/awk-fs-with-back-slashes
之后我尝试将其添加到以{:1>}开头的脚本:
.sh
My Line:
#!/bin/bash
然后我使用:
打印输出category1Filenames=(\`find . -maxdepth 1 -type f |
gawk 'BEGIN { FS = "(\\\\./)|(\\\\.)" } ; { print $2 }' | sort -u\`)
但这给了我错误:
for genericFilename in ${category1Filenames[@]}; do
printf "%s\n" $genericFilename
done
如果我将该行更改为:
gawk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
然后按预期工作。
我假设问题在于使用后退字符,但我不明白为什么。可能是因为我不理解category1Filenames=$(find . -maxdepth 1 -type f |
gawk 'BEGIN { FS = "(\\\\./)|(\\\\.)" } ; { print $2 }' | sort -u)
vs `
vs '
的行为。如果有人能指出可以解释这种行为的文档(也许是tldp)那么我将非常感激。
答案 0 :(得分:1)
反引号(`)用于旧式命令替换,建议使用foo=$(command)
语法。 $()
内的反斜杠处理不那么令人惊讶,$()
就是这样
更容易筑巢。见BashFAQ82
使用反引号,您必须转义gawk
所需的序列:
category1Filenames=(`find . -maxdepth 1 -type f | gawk 'BEGIN { FS = "(\\\./)|(\\\.)" } ; { print $2 }' | sort -u`)
除此之外:在循环中输入categoryFilenames
数组:
while read -r line; do
categoryFilenames+=("$line")
done < <(find . -maxdepth 1 -type f | gawk 'BEGIN { FS = "(\./)|(\.)" } ; { print $2 }' | sort -u)
现在像你一样迭代categoryFilenames
更安全,但是使用双引号:
for genericFilename in "${category1Filenames[@]}"; do
printf "%s\n" "$genericFilename"
done
不要忘记&#34;双引号&#34; 每个包含空格/元字符和每个扩展的文字:"$var"
, "$(command "$var")"
,"${array[@]}"
,"a & b"
。
答案 1 :(得分:1)
而不是find
,只是迭代当前目录中的所有文件,并使用shell处理常规文件并提取文件名。
for name in *; do
[[ -f $name ]] || continue
name_only=${name%%.*}
printf "%s\n" "$name_only"
done