我正在写类似以下脚本的内容。它没有按预期工作,因为该函数deleteCEfromCeLst
必须调用一个脚本,通过该spawnPrg
函数为其指定一个“void”参数,但是如果我在函数参数中指定直接从提示符调用脚本时使用的spawnPrg
“void”参数,则此“void”参数结果(正确地)为空,而不是作为未指定的参数。''
$HOME/execsh/delete.sh
该函数的使用spawnPrg
是强制性的,因为它将被从“主”流程调用的其他函数或直接由主流程使用,此外,该函数spawnPrg
应包含注册诸如日志文件之类的内容的行为。
#!/bin/bash
spawnPrg()
{
echo $@
$@ &
return
}
deleteCEfromCeLst()
{
local d
cat ce.lst | while read d; do
spawnPrg $HOME/execsh/delete.sh $1 '' $d
done
return
}
deleteCEfromCeLst
exit
我也尝试编码deleteCEfromCeLst
为:
deleteCEfromCeLst()
{
local d
cat ce.lst | while read d; do
spawnPrg "$HOME/execsh/delete.sh $1 '' $d"
done
return
}
使用上面的代码,结果是函数spawnPrg在发送到提示符时被执行,如下所示:
$HOME/execsh/delete.sh $1 \'\' $d
其中“void”参数指定为字符串''
,即发送到delete.sh
脚本的第二个参数不是“void”参数。
答案1
引用变量扩展。
如果我们有一个脚本foo.sh
:
$ cat foo.sh
#!/bin/sh
args() {
printf ">%s<\n" "$@"
}
args "$1" "" foo
我们用 来调用它sh foo.sh ""
,输出是:
><
><
>foo<
也就是说,一个来自"$1"
( 的参数)的空参数,另一个来自脚本中的foo.sh
硬编码,然后是固定字符串。""
foo
如果$@
或中的任何一个$1
未被引用,则相关的空值将作为分词的一部分消失。
看: