我正在用bash写一个小的.sh程序。
问题非常简单,即对一个数字的主要因素进行处理。 我所做的是写一个.sh文件来检查数字是否为素数。 这是代码:
if [ $# -ne 1 ]; then
exit
fi
number=$1
half=$(($number / 2))
for (( i=2;i<$half;i++ ))
do
rem=$(($number % $i))
if [ $rem -eq 0 ]; then
echo "0"
exit
fi
done
echo "1"
第二个.sh文件生成素数因子:
clear
echo "Enter number : "
read number
half=$(($number / 2))
for(( i=1;i<=$half;i++ ))
do
rem=$(($number % $i))
if [ $rem -eq 0 ]; then
ok=`prime.sh $rem`
if [ "$ok" == "1" ]; then
echi $i
fi
fi
done
这一行,
ok=`prime.sh $rem`
给出以下错误:
primefactor.sh: line 10: prime.sh: command not found
那么,是否不可能将程序划分为更小的模块并在其他模块中像其他编程语言一样使用它? 有关如何实现这一目标的一些帮助将会有所帮助。
答案 0 :(得分:2)
primefactor.sh: line 10: prime.sh: command not found
...表示prime.sh
不在您的PATH中,或者不可执行。有几种方法可以解决这个问题:
+x
位:
chmod +x prime.sh
PATH=.:$PWD
ok=$(./prime.sh)
顺便说一句,以.sh
结尾的名称适用于POSIX sh 库,而不是bash 脚本(通常不是有效的POSIX sh脚本无论如何)。你不能跑ls.elf
;出于同样的原因,您应该运行prime
,而不是prime.sh
。
也就是说,如果你的目标只是在多个文件中分割代码,那么库可能是正确的。使用子shell(分叉现有的shell实例)比产生子进程(包括fork和exec)更有效。
例如,你可以写prime.bash
:
check() {
local number half i rem
number=$1
half=$((number / 2))
for (( i=2; i<half; i++ )); do
rem=$((number % i))
if (( rem == 0 )); then
echo "0"
return
fi
done
echo "1"
}
...然后,在您的primefactor
脚本中,读入该库并使用它定义的函数:
source prime.bash # read in the library
clear
echo "Enter number : "
read number
half=$((number / 2))
for(( i=1;i<=half;i++ ))
do
rem=$((number % i))
if (( rem == 0 )); then
ok=$(check "$rem")
if [[ $ok = 1 ]]; then
echo "$i"
fi
fi
done
答案 1 :(得分:1)
像这样调用你的脚本:
ok=`./prime.sh $rem`