Ksh和if语句

我在C ++中做了很less的编程,而且我不太了解如何在Knoppix OS上使用KornShell(ksh)中的代码。 教授给我们的资源很less,所以很难解决。 我们上课的两本教科书大多是关于UNIX变种的命令,与ksh很less有关系。

编写一个shell脚本,它只接受一个必须是正整数的参数。 (我的第二个有两个)

Ksh代码:

NUMBER=$1 read -p NUMBER # Test that one argument was input. if [[ $# -ne 1 ]];then echo "Please enter an integer as an argument" exit 1 elif [[ $NUMBER -le 0 ]];then # Test value of argument is less than or equal to zero echo "Please enter a number > 0" exit 1 fi while [["$NUMBER" -ne 1]];do printf $NUMBER if [[$NUMBER -gt 1]];then printf "," fi NUMBER=$(($NUMBER-1)) done printf $NUMBER 

当我从shell中运行这个函数的时候,我总是会得到“请input一个整数作为参数”作为输出,虽然条目是3,或者类似的东西。

我注意到没有任何用户input,所以我试图自己input这个

 read -p NUMBER 

if语句之前。

我从代码中遗漏了什么,继续运行脚本的其余部分?

您应该在条件中双引号变量,或者使用扩展[[ ... ]]条件(是的,第三种条件)。 对于数字操作,通常使用(( .. )) (哦,我的第四种!)。

请参阅man bash或高级Bash脚本指南 。

第一个通过的论点应该是通过使用获得的

 NUMBER=$1 

不知道你的意思是$X ..

注意:$ 0是执行的命令,例如在./myscript.sh foo

$0 = ./myscript.sh$1 = foo

在你设置为变量NUMBER你可以检查它是否是一个正整数:

 if [[ $NUMBER =~ ^[0-9]+$ ]]; then echo "It's ok!" else echo "BAD :(" fi 

只接受一个参数,你应该检查传递给脚本的参数的数量(这是我认为你的老师所要求的):

 if [[ $# -ne 1 ]] 

$#为您提供了传递给脚本的参数的数量,所以很容易检查传递给它的参数的数量。 现在你只需要检查它是否是一个整数和符号。 我不知道你的老师想让你知道什么,但是你可以使用awk的函数来检查参数是一个数字,一个整数和它的符号(这个符号用ksh也很容易)。

你应该删除read -p NUMBER指令,这将击败前一个指令。

你应该修理那条线:

 elif [[ $NUMBER -le 0 ]];then 

 elif [ "$NUMBER" -le 0 ];then 

最后一部分是使用错误的测试,并且缺少一个结束的新行:

 while [["$NUMBER" -ne 1]];do printf $NUMBER if [[$NUMBER -gt 1]];then printf "," fi NUMBER=$(($NUMBER-1)) done printf $NUMBER 

应该

 while [ $NUMBER -ne 1 ];do printf $NUMBER if [ $NUMBER -gt 1 ];then printf "," fi NUMBER=$((NUMBER-1)) done printf "%s\n" $NUMBER