删除最终的 bash 脚本参数

Posted

技术标签:

【中文标题】删除最终的 bash 脚本参数【英文标题】:Removing final bash script argument 【发布时间】:2011-01-28 08:18:01 【问题描述】:

我正在尝试编写一个脚本来搜索目录中的文件和 greps 模式。类似于下面的除了,查找表达式要复杂得多(不包括特定的目录和文件)。

#!/bin/bash
if [ -d "$!#" ]
then
    path=$!#
else
    path="."
fi

find $path -print0 | xargs -0 grep "$@"

显然,上述方法不起作用,因为"$@" 仍然包含路径。我尝试了通过迭代所有参数以排除路径来构建参数列表的变体,例如

args=$@%$path
find $path -print0 | xargs -0 grep "$path"

whitespace="[[:space:]]"
args=""
for i in "$@%$path"
do
    # handle the NULL case
    if [ ! "$i" ]
    then
        continue
    # quote any arguments containing white-space
    elif [[ $i =~ $whitespace ]]
    then
        args="$args \"$i\""
    else
        args="$args $i"
    fi
done

find $path -print0 | xargs -0 grep --color "$args"

但这些因引用输入而失败。例如,

# ./find.sh -i "some quoted string"
grep: quoted: No such file or directory
grep: string: No such file or directory

请注意,如果$@ 不包含路径,则第一个脚本会执行我想要的操作。


编辑:感谢您提供出色的解决方案!我结合了答案:

#!/bin/bash

path="."
end=$#

if [ -d "$!#" ]
then
    path="$!#"
    end=$((end - 1))
fi

find "$path" -print0 | xargs -0 grep "$@:1:$end"

【问题讨论】:

【参考方案1】:

编辑:

原版只是略有偏差。如果最后一个参数不是目录,则不会删除。

#!/bin/bash
if [ -d "$!#" ]
then
    path="$!#"
    remove=1
else
    path="."
    remove=0
fi

find "$path" -print0 | xargs -0 grep "$@:1:$(($#-remove))"

【讨论】:

+1 我从您的回答中学到了 2 件事,并且我广泛使用 bash 超过 10 年

以上是关于删除最终的 bash 脚本参数的主要内容,如果未能解决你的问题,请参考以下文章

什么相当于Python中的Bash的exec $ @?

三bash脚本参数的设定

如何在bash脚本中使用命令行参数?

Bash:无法通过 mediainfo 浏览目录中的所有文件

从 bash 中的 $@ 中删除第一个元素 [重复]

在 bash 脚本中,我有一组参数要传递给另一个 bash 脚本。我该怎么做? [复制]