当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Bash脚本用于接收和重新引用引用的参数》经验,为你挑选了2个好方法。



1> Dave Dopson..:

您希望使用"$ @"(引用的美元at)将参数传递给下标.像这样....

ls-color.sh:

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


至于为什么......

从Bash手册页:

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

$@ - 从1开始扩展到位置参数.当扩展发生在双引号内时,每个参数都会扩展为单独的单词.也就是说,"$@"相当于"$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"

"$*"- quoted-dollar-star 将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解释为什么$ @优于$*

2> pixelbeat..:
#!/bin/bash
echo $*
bash myecho.sh "$@"

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

./test.sh 1 2 "3 4"


"$ @"适用于任何Bourne shell或Bourne shell派生词(从1978年开始),包括Korn和Bash.可能95%的时间,使用"$ @"是正确的,$*是错误的.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有