为什么`读线;声明$ line`和`find ... +`?

时间:2015-02-28 14:11:44

标签: linux bash

以下脚本有效,但declare $line有什么用途?如果我删除它,它就不起作用。

{} \;命令中{} +find的区别是什么?

awk '{print "old="$1" new="$2}' list.txt |\
while IFS= read line; do
    declare $line
    find /path -name '*.ext' -exec sed -i "s/\b$old\b/$new/" {} +
done

2 个答案:

答案 0 :(得分:6)

declare正在设置变量:您的awk命令会发出old=foo new=bar形式的内容。运行declare old=foo new=bar会设置这两个变量。

尽管如此,这是一种错误和草率的方式。相反,使用read直接从输入文件中读取所需的字段并分配给变量(BashFAQ #1中的更多内容):

while read -u 3 -r old new _; do
    find /path -name '*.ext' -exec sed -i "s/\b$old\b/$new/" {} +
done 3<list.txt

为了使这更安全一点,人们也可以逃避文字内容而不被视为正则表达式:

requote() { sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$1"; };
substquote() { sed 's/[&/\]/\\&/g' <<< "$1"; }
while read -u 3 -r old new _; do
    find /path -name '*.ext' -exec \
        sed -i "s/\b$(requote "$old")\b/$(substquote "$new")/" {} +
done 3<list.txt

请注意,我没有更改\b的使用,这是sed的许多实现不支持的扩展。有关进行文字字符串替换的替代方法,请参阅BashFAQ #21


为了完整性(尽管这个不相关的主题确实应该被作为一个单独的问题提出 - 并且在这种情况下可能会被重复关闭,因为之前已经被问及并回答过),请允许引用{{{ 1}}手册页:

find

答案 1 :(得分:-1)

声明或排版Builtins是完全同义词,允许修改变量的属性。这是某种编程语言中可用类型的一种非常弱的形式。 declare命令特定于Bash的版本2或更高版本。 typeset命令也适用于Ksh脚本。