我想在 .profile 文件中创建的函数中使用参数。
如果没有给出参数,我想请求输入,否则将变量设置为 $1。
当我检查 $1 是否为空时,出现以下错误:
sh[7]: 1: Parameter not set.
从以下行:
if [ ! -n "$1" ]; then
我用的是sh而不是bash。
编辑:好的,这是第一行代码,直到 if 语句结束:
HOST=`hostname`
cd /opt/dirpath
ll *.sto
if [ x"$1" = x ]; then
# Ask for input
echo "File: \c"; read outFile
else
outFile=$1
fi
我正在编辑其他人的代码以使用或不使用参数。
答案1
我认为这还有更多内容:
要么这不是您正在使用的命令,要么是在函数的其他地方您正在以不同的方式执行此操作。该错误来自${1?}
.或者它来自您的测试,但前提是您首先这样做set -u
。
要解决这个问题,请停止这样做。这样做set +u; fn_name
,看看会发生什么。如果你${1?}
在那里有任何扩展,那么在你给函数一个参数之前,这个错误不会消失。
以下是一些如何重现该错误的代码示例:
sh -c 'fn(){ [ ! -n "${1?}" ]; }; fn'
sh: 1: 1: parameter not set
...或者...
sh -uc 'fn(){ [ ! -n "$1" ]; }; fn'
sh: 1: 1: parameter not set
...但...
sh -uc 'fn(){ [ ! -n "$1" ]; }
set +u; fn; echo "$?"'
0
...和...
sh -c 'fn(){ [ ! -n "${1?}" ]; }
fn some args; echo "$?"'
1
如果该功能正在设置-u
,那么您可能应该将其编辑掉。否则,如果您.profile
这样做,也一样。大多数情况下,set -u
是不是理想的持久 shell 设置,这是因为该模式是设计的杀死贝壳。它没有提供任何简单的方法来处理它生成的错误类型 - 这正是您尝试使用[
test执行的操作]
。