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

Pass $@ to a function in a shellscript

问题描述

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

如何以不破坏空格的方式将 $@ 传递给函数?很抱歉,如果之前有人问过这个问题,我尝试搜索这个问题并 there are a lot similar ones,但我仍然没有找到答案。

插图

我做了一个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 显示为单个参数。我想要一个提供与主作用域相同输出的函数。

您可以使用这个 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