将 $@ 传递给 shell 脚本中的函数

Posted

技术标签:

【中文标题】将 $@ 传递给 shell 脚本中的函数【英文标题】:Pass $@ to a function in a shellscript 【发布时间】:2015-10-09 18:09:49 【问题描述】:

问题描述

在 shell 脚本中,我想从函数内部迭代所有命令行参数 ("$@")。但是,在函数内部,$@ 指的是函数参数,而不是命令行参数。我尝试使用变量将参数传递给函数,但这无济于事,因为它会用空格破坏参数。

我怎样才能将$@ 传递给函数,使其不会破坏空格?很抱歉,如果之前有人问过这个问题,我尝试搜索这个问题和therearealotsimilarones,但我仍然没有找到答案。

插图

我做了一个shell脚本来说明问题。

print_args.sh 源码列表

#!/bin/sh
echo 'Main scope'
for arg in "$@"
do
    echo "    $arg"
done

function print_args1() 
    echo 'print_args1()'
    for arg in "$@"
    do
        echo "    $arg"
    done


function print_args2() 
    echo 'print_args2()'
    for arg in $ARGS
    do
        echo "    $arg"
    done


function print_args3() 
    echo 'print_args3()'
    for arg in "$ARGS"
    do
        echo "    $arg"
    done


ARGS="$@"

print_args1
print_args2
print_args3

print_args.sh 执行

$ ./print_args.sh foo bar 'foo bar'
Main scope
    foo
    bar
    foo bar
print_args1()
print_args2()
    foo
    bar
    foo
    bar
print_args3()
    foo bar foo bar

如您所见,我无法让最后一个 foo bar 显示为单个参数。我想要一个输出与主作用域相同的函数。

【问题讨论】:

引用你的变量。这就是答案。使用func "$@" 而不是func $@ 来正确传递参数。你知道你需要在函数本身和主体中这样做。显然,您只是在将它们传递给函数时忘记了这样做。 ideone.com/QTsGiK 哎呀,很抱歉删除我的评论,香肠手指。这确实有效,而且该解决方案似乎非常便携。在我的具体情况下,使用脚本全局变量会更容易,但作为变量传递当然是我可以使用的。 "$@" 作为参数传递给函数是完全可移植的(据我所知)。数组不是。在这里使用字符串不是解决方案。它根本不起作用。有关字符串中完整命令行的类似对话,请参阅 Bash FAQ 050。 加1 了解问题的结构。 【参考方案1】:

你可以使用这个 BASH 函数:

#!/bin/bash

echo 'Main scope'
for arg in "$@"
do
    echo "    $arg"
done

function print_args1() 
    echo 'print_args1()'
    for arg in "$@"; do
        echo "    $arg"
    done


function print_args3() 
    echo 'print_args3()'
    for arg in "$ARGS[@]"; do
        echo "    $arg"
    done


ARGS=( "$@" )

print_args1 "$@"
print_args3

你可以在顶部看到 bash shebang 的使用:

#!/bin/bash

需要能够使用 BASH 数组。

输出:

bash ./print_args.sh foo bar 'foo bar'
Main scope
    foo
    bar
    foo bar
print_args1()
    foo
    bar
    foo bar
print_args3()
    foo
    bar
    foo bar

【讨论】:

谢谢,看起来不错。我不喜欢使用 bashism,但这确实有效,而且使用 bashism 比使用变通方法更干净。 BASH 不会伤害任何东西 :)

以上是关于将 $@ 传递给 shell 脚本中的函数的主要内容,如果未能解决你的问题,请参考以下文章

Shell特殊变量 $0, $#, $*, $@, $?, $$和命令行参数

Linux学习总结(六十)shell脚本4-函数及数组

shell脚本学习

shell特殊变量

CASE20210510

参数传递:shell脚本调用一个带参数的python函数