将 $@ 传递给 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
问题描述
在 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