jor*_*ane 4 bash shell argument-passing command-line-arguments
在shell脚本中,我想从函数内部迭代所有命令行参数("$@").但是,在函数内部,是指函数参数,而不是命令行参数.我尝试使用变量将参数传递给函数,但这没有用,因为它会破坏带有空格的参数.$@
如何$@以不破坏空格的方式传递给函数?我很抱歉,如果这已被问过,我试图寻找这个问题,有 是 一个 很多 类似 的人,但我没有仍然找到答案.
我制作了一个shell脚本来说明问题.
#!/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
Run Code Online (Sandbox Code Playgroud)
$ ./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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我无法将最后一个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
Run Code Online (Sandbox Code Playgroud)
你可以看到顶部使用bash shebang:
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
要求能够使用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
Run Code Online (Sandbox Code Playgroud)