Shell Linux脚本:命令行参数

Shell Linux脚本:命令行参数,shell,command,arguments,line,Shell,Command,Arguments,Line,尝试编写只接受一个命令行参数且必须为正数的脚本。我记下了一个论点,但无法算出正数。 我有以下资料: #!/bin/ksh NUMBER=$1 # Accepts only one argument or does not execute. if [ "$#" != 1 ] then echo "error: program must be executed with 1 argument." exit else if [ "$#" <

尝试编写只接受一个命令行参数且必须为正数的脚本。我记下了一个论点,但无法算出正数。 我有以下资料:

  #!/bin/ksh

  NUMBER=$1
  # Accepts only one argument or does not execute.
  if [ "$#" != 1 ]
  then
     echo "error: program must be executed with 1 argument."
     exit
  else
      if [ "$#" < 1 ] # **NEED HELP HERE**. Check for negative number.
  then
      echo "error: argument must be a positive number."
  fi
  fi
  do
         echo -n $NUMBER
         if [ $NUMBER -gt 1 ]
         then
            echo -n ", "
         fi
         NUMBER=$(($NUMBER - 1))
   done
   echo
#/bin/ksh
数字=$1
#只接受一个参数或不执行。
如果[“$#”!=1]
然后
echo“错误:程序必须使用1个参数执行。”
出口
其他的
如果[“$#”<1]#**需要帮助,请点击这里**。检查负数。
然后
echo“错误:参数必须为正数。”
fi
fi
做
echo-n$NUMBER
如果[$NUMBER-gt 1]
然后
回声-n“
fi
数字=$($NUMBER-1))
完成
回声
…需要帮助确定命令行参数是否为负数

谢谢

以下功能将起作用:

test "$NUMBER" -ge 0 && printf "NOT NEGATIVE" || printf "NEGATIVE"

通过检查是否仅为数字来验证该数字:

#!/bin/ksh

NUMBER=$1
# Accepts only one argument or does not execute.
if [ "$#" != 1 ]
then
  echo "error: program must be executed with 1 argument."
  exit
else
  case $NUMBER in
    ''|*[!0-9]*)
      echo "error: argument must be a positive number."
      exit
      ;;
  esac
fi

while ! [ $NUMBER -lt 1 ]
do
     echo -n $NUMBER
     if [ $NUMBER -gt 1 ]
     then
        echo -n ", "
     fi
     NUMBER=$(($NUMBER - 1))
done
echo

假设我们只讨论正(10进制)整数。。。不包括逗号、指数符号和前导加号(+)

显然,当你去掉对定义为*valid*
正数的假设时,它就变得有点有趣了


扩展由…提出的解决方案。。。一个简单的函数应该允许我们处理指数表示法、浮点/实数和带前导加号(+)的数字,同时允许调用过程过滤掉有关语法错误的消息

$cat test.sh
#!/bin/ksh
NUMBER=$1
isnumber()
{
    # following should generate a non-zero for negative and non-numerics,
    # while allowing the parent process to filter out syntax errors

    [[ "${1}" -gt 0 ]]
}

# direct isnumber() output to /dev/null since we're only interested
# in the return code, and we want to mask any syntax issues if
# isnumber() is called with a non-numeric argument; unfortunately,
# for a valid numeric that contains a comma (eg, NUMBER = 1,000)
# our isnumber() call will fail

if isnumber ${NUMBER} >/dev/null 2>&1
then
    echo "${NUMBER} is a positive number"
else
    echo "${NUMBER} is not a positive number"
fi
还有一些测试

$ for s in 1 1.33 1e5 1e-4 +1 +1.65 +1e4 1,000 -1 -1.234 -1e5 -1,000 a b a1b ab1 1ab "a b c"
do
test.sh "$s"
done
1 is a positive number
1.33 is a positive number
1e5 is a positive number
1e-4 is a positive number
+1 is a positive number
+1.65 is a positive number
+1e4 is a positive number
1,000 is not a positive number
-1 is not a positive number
-1.234 is not a positive number
-1e5 is not a positive number
-1,000 is not a positive number
a is not a positive number
b is not a positive number
a1b is not a positive number
ab1 is not a positive number
1ab is not a positive number
a b c is not a positive number

这个问题留给我们(我相信)一个包含1个或更多逗号的输入的问题,它可以用任何符合你想象的方法将逗号删去。

你认为什么是有效的<代码>正数< /代码>…只有整数?浮动/真实(如3.1415)?指数表示法(如1e+5)?前导
+
(例如,+5)?是的,只有整数-1、2、3等。ksh:
NUMBER=1a;测试“$NUMBER”-ge 0&&printf“NOT NEGATIVE”| | printf“NEGATIVE”
=>
-ksh:test:1a:算术语法错误
负数
这对我不起作用。即使输入一个正数,我也得到了“参数必须是正数”;我还在学习。我不懂台词。
$ for s in 1 1.33 1e5 1e-4 +1 +1.65 +1e4 1,000 -1 -1.234 -1e5 -1,000 a b a1b ab1 1ab "a b c"
do
test.sh "$s"
done
1 is a positive number
1.33 is a positive number
1e5 is a positive number
1e-4 is a positive number
+1 is a positive number
+1.65 is a positive number
+1e4 is a positive number
1,000 is not a positive number
-1 is not a positive number
-1.234 is not a positive number
-1e5 is not a positive number
-1,000 is not a positive number
a is not a positive number
b is not a positive number
a1b is not a positive number
ab1 is not a positive number
1ab is not a positive number
a b c is not a positive number