变量赋值之间的差异

时间:2016-02-22 21:27:07

标签: bash variable-assignment quotes

我在这里回答了一个问题: 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)那么我将非常感激。

2 个答案:

答案 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