Bash脚本用于接收和重新引用引用的参数

时间:2009-01-15 20:47:35

标签: bash unix

我正在尝试获取bash脚本的引用参数,以便由嵌套脚本安全地接收。有什么想法吗?

test.sh

#!/bin/bash
echo $*
bash myecho.sh $*

myecho.sh

#!/bin/bash
 echo $1
 echo $2
 echo $3
 echo $4

样品:

bash test.sh aaa bbb '"ccc ddd"'

结果:

aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"

通缉结果

aaa bbb "ccc ddd"
aaa
bbb
ccc ddd

2 个答案:

答案 0 :(得分:135)

您想使用“$ @”(引用美元at)将参数传递给下标。像这样....

<强> ls-color.sh:

#!/bin/bash
/bin/ls --color=auto "$@"    # passes though all CLI-args to 'ls'


至于为什么......

来自Bash man page

  

$* - 从1开始扩展到位置参数。什么时候   扩展发生在双引号内,它扩展为单个单词   每个参数的值由第一个字符分隔   IFS特殊变量。也就是说,"$*"相当于   "$1c$2c...",其中c是IFS值的第一个字符   变量。如果未设置IFS,则参数由空格分隔。如果   IFS为null,参数在没有插入分隔符的情况下连接。

     

$@ - 从1开始扩展到位置参数。什么时候   扩展发生在双引号内,每个参数扩展为a   单词。也就是说,"$@"相当于"$1" "$2" ...   双语扩张发生在一个词内,扩展了   第一个参数与原始的开头部分连接在一起   单词,并将最后一个参数的扩展与最后一个参数连接起来   原始单词的一部分。没有位置参数时   "$@"$@扩展为空(即删除它们)。


设置一些演示脚本......

echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh $@' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "$@"' > quoted-dollar-at.sh
chmod +x *.sh

"$@" - quoted-dollar-at是 身份转换 ,用于将args重新传递给子shell(约99%的时间,这是你打算做什么):

./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2=            
  # $3= 'cc cc'
  # $4= "ddd ddd"

"$*" - 引用美元星 将args打成一个字符串 (大约1%的时间你真正想要这种行为,例如条件:if [[ -z "$*" ]]; then ...):

./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa  'cc cc' "ddd ddd"   
  # $2=                     
  # $3=             
  # $4=

$* / $@ - 没有引号,两种形式都剥离了一个引用级别并解释了基础字符串中的空格但忽略了引号字符(几乎总是,这是一个错误):

./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc                  
  # $3= cc'
  # $4= "ddd

./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc
  # $3= cc'
  # $4= "ddd

如果你想获得一些乐趣,你可以使用“$ @”来尽可能深地嵌套东西,如果你愿意,可以从args堆栈中推送和弹出元素。

function identity() {
  "$@"
}
set -x
identity identity identity identity identity echo Hello \"World\"
# + identity identity identity identity identity echo Hello '"World"'
# + identity identity identity identity echo Hello '"World"'
# + identity identity identity echo Hello '"World"'
# + identity identity echo Hello '"World"'
# + identity echo Hello '"World"'
# + echo Hello '"World"'
# Hello "World"

答案 1 :(得分:65)

#!/bin/bash
echo $*
bash myecho.sh "$@"

请注意,“$ @”构造不是特定于bash的,应该适用于任何POSIX shell(至少使用破折号)。另请注意,根据您想要的输出,您根本不需要额外的引用级别。 I.E.只需调用上面的脚本:

./test.sh 1 2 "3 4"