处理 bash 脚本参数中的空格

发布于 2024-10-30 20:29:10 字数 442 浏览 1 评论 0原文

我在处理 bash 脚本中包含空格的参数时遇到问题。

脚本

#!/bin/bash
for i in $*
do
    echo "$i"
done

调用(有 2 个参数)

$ ./script.sh "a b" "c"

实际输出(就好像有 3 个参数) 预期输出(就好像有 3 个参数)

a
b
c

预期输出(就好像 有 3 个参数)有 2 个参数)

a b
c

有人可以解释如何获得预期的输出吗?

I am having issues handling arguments that contain white spaces in a my bash script.

The script

#!/bin/bash
for i in $*
do
    echo "$i"
done

The call (with 2 arguments)

$ ./script.sh "a b" "c"

The actual output (as if there were 3 arguments)

a
b
c

The expected output (as if there were 2 arguments)

a b
c

Can someone explain how to get the expected output?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦境 2024-11-06 20:29:10

将第一行的 $* 更改为 "$@"

Change $* to "$@" on the first line.

我的奇迹 2024-11-06 20:29:10

您想要的是 $@ 作为参数(并且您必须将其括在“”中)而不是 $*。

What you want is $@ for the parameters (and you have to enclose it in "") instead of $*.

风尘浪孓 2024-11-06 20:29:10

回复 2011 年留下的关于如何将每个参数分配给变量的评论...

这个 bash 函数将每个参数分配给数组中的一个项目。然后这些可以在其他地方使用。

该函数查找某种类型的文件,然后对它们进行 grep:

search "multi word search terms" txt

相关行是前 5 行。我们初始化一个数组,循环传递的参数,并将它们分配为数组中的项目。然后函数根据需要引用它们。

通过这种方式,您可以指定可选的第三个参数以在您选择的编辑器中打开文件:

search "multi word search terms" txt mate

变量 $searchterm 已转义空格,以便 grep 将其作为一个字符串接受。

function search() {
        terms=();
        for i in "$@"
        do
                terms+=("$i")
        done

        file='*.'${terms[1]};
        searchterm=${terms[0]// /\\ };

        if [ -n "$3" ]; then
                find . -type f -name $file -exec grep -irl "$searchterm" {} \; | xargs ${terms[2]};
        else
                find . -type f -name $file -exec grep -irl "$searchterm" {} \;;
        fi
}

希望这对某人有帮助!

Replying to the comment left in 2011 on how to assign each argument to a variable...

This bash function assigns each argument to an item in an array. These can then be used elsewhere.

The function in question finds files of a certain type and then greps them:

search "multi word search terms" txt

The relevant lines are the the first 5. We initialise an array, loop over the arguments passed, and assign them as items in the array. These are then referenced by the function as required.

This way you can specify an optional 3rd parameter to open the files in an editor of your choice:

search "multi word search terms" txt mate

The variable $searchterm has had spaces escaped so that grep will accept it as one string.

function search() {
        terms=();
        for i in "$@"
        do
                terms+=("$i")
        done

        file='*.'${terms[1]};
        searchterm=${terms[0]// /\\ };

        if [ -n "$3" ]; then
                find . -type f -name $file -exec grep -irl "$searchterm" {} \; | xargs ${terms[2]};
        else
                find . -type f -name $file -exec grep -irl "$searchterm" {} \;;
        fi
}

Hope this helps someone!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文