我正在尝试获取bash脚本的引用参数,以便安全地通过嵌套脚本接收.有任何想法吗?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
Run Code Online (Sandbox Code Playgroud)
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Run Code Online (Sandbox Code Playgroud)
样品:
bash test.sh aaa bbb '"ccc ddd"'
Run Code Online (Sandbox Code Playgroud)
结果:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Run Code Online (Sandbox Code Playgroud)
想要结果
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Run Code Online (Sandbox Code Playgroud)
Dav*_*son 139
您希望使用"$ @"(引用的美元at)将参数传递给下标.像这样....
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
Run Code Online (Sandbox Code Playgroud)
从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
Run Code Online (Sandbox Code Playgroud)
"$@"- quoted-dollar-at是一个身份转换,用于将args重新传递给子shell(约99%的时间,这就是你的意思):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
Run Code Online (Sandbox Code Playgroud)
"$*"- 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=
Run Code Online (Sandbox Code Playgroud)
$*/ $@- 没有引号,两个表单都剥离了一个引用级别并解释了底层字符串中的空格但忽略了引号字符(几乎总是,这是一个错误):
./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
Run Code Online (Sandbox Code Playgroud)
如果你想获得一些乐趣,你可以使用"$ @"来嵌入你喜欢的东西,如果你愿意,可以从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"
Run Code Online (Sandbox Code Playgroud)
pix*_*eat 68
#!/bin/bash
echo $*
bash myecho.sh "$@"
Run Code Online (Sandbox Code Playgroud)
请注意,"$ @"构造不是特定于bash的,并且应该适用于任何POSIX shell(至少使用破折号).另请注意,根据您想要的输出,您根本不需要额外的引用级别.IE只需调用上面的脚本:
./test.sh 1 2 "3 4"
Run Code Online (Sandbox Code Playgroud)