我发现了这个功能:
findsit()
{
OPTIND=1
local case=""
local usage="findsit: find string in files.
Usage: fstr [-i] \"pattern\" [\"filename pattern\"] "
while getopts :it opt
do
case "$opt" in
i) case="-i " ;;
*) echo "$usage"; return;;
esac
done
shift $(( $OPTIND - 1 ))
if [ "$#" -lt 1 ]; then
echo "$usage"
return;
fi
find . -type f -name "${2:-*}" -print0 | \
xargs -0 egrep --color=always -sn ${case} "$1" 2>&- | more
}
我理解输出及其作用,但有些术语我仍然不明白,并且发现很难找到参考,但相信它们对我的编程学习很有用。有人能快速解释一下吗?有些人没有手册页。
本地
getopts的
情况下
移
$#
$ {2: - *}
2 - ;&安培; -
谢谢。
答案 0 :(得分:3)
foo
的变量。您调用的函数也具有变量foo
。假设该函数更改了foo
的值。 试试这个程序:
testme()
{
foo="barfoo"
echo "In function: $foo"
}
foo="bar"
echo "In program: $foo"
testme
echo "After function in program: $foo"
请注意,即使函数完成,函数也会更改$foo
的值。通过声明local foo="barfoo"
而非foo="barfoo"
,我们可以防止这种情况发生。
这两个或多或少是等同的:
if [[ "$foo" == "bar" ]]
then
echo "He said 'bar'!"
elif [[ "$foo" == "foo" ]]
then
echo "Don't repeat yourself!"
elif [[ "$foo" == "foobar" ]]
then
echo "Shouldn't it be 'fubar'?"
else
echo "You didn't put anything I understand"
fi
和
case $foo in
bar)
echo "He said 'bar'!"
;;
foo)
echo "Don't repeat yourself!"
;;
foobar)
echo "Shouldn't it be 'fubar'?"
;;
*)
echo "You didn't put anything I understand"
;;
esac
;;
结束case
选项。否则,它将下拉到下一个并执行这些行。我有三行中的每个选项,但它们通常合并为
foobar) echo "Shouldn't it be 'fubar'?";;
shift :命令行参数放在名为$*
的变量中。当您说shift
时,它会获取该$*
变量中的第一个值,并将其删除。
getopts :Getopts是一个相当复杂的命令。它用于解析$@
变量中的单个字母选项的值(包含命令行中的参数和参数)。通常,您在while循环中使用getopts
并使用case
语句来解析输出。格式为getopts <options> var
。 var
是一次包含每个选项的变量。指定单个字母参数以及哪些参数需要参数。解释它的最佳方式是向您显示simple example。
$#:命令行中的参数/参数数量。
$ {var:-alternative} :这表示使用环境变量$var
的值。但是,如果未设置此环境变量或为null,请改为使用值alternative
。在此程序中,使用$ {2: - *}代替。 $2
表示由于shift
命令导致所有内容移出后,命令行参数/参数中剩余内容的第二个参数。
2&gt;&amp; - :这会将标准错误移至标准输出。标准错误是放置错误消息的位置。通常,它们就像标准输出一样放在终端屏幕上。但是,如果将输出重定向到文件中,错误消息仍会打印到终端窗口。在这种情况下,将输出重定向到文件也会重定向任何错误消息。
答案 1 :(得分:2)
那些是bash内置插件。您应该阅读bash手册页,或者对于getopts,请尝试帮助getopts
一次一个(在ipad上打字因此切换到笔记本电脑真的很烦人):
local
允许您定义局部变量(在函数范围内)
getopts
是一个bash内置函数,它实现了getopt样式的参数处理(-a
,-b
...类型参数)
case
是switch语句的bash表单。语法是
case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
shift
将所有参数移位1(使第二个参数成为第一个,第三个变为第二个,......)类似于perl shift。如果您指定一个参数,它将移动那么多索引(因此shift 2
将分配$3 -> $1, $4 -> $2, ...
)
$#
是传递给函数的参数数量
${2:-*}
是默认参数形式。基本上,它会查看第二个参数($2
是第二个参数),如果未分配,则会将其替换为*
。
2>&-
是输出重定向(在本例中为标准错误)