sh - 在 .profile 函数中使用参数

sh - 在 .profile 函数中使用参数

我想在 .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执行的操作]

相关内容