在另一个.sh文件中使用自写.sh文件

时间:2014-03-22 20:41:21

标签: bash

我正在用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

那么,是否不可能将程序划分为更小的模块并在其他模块中像其他编程语言一样使用它? 有关如何实现这一目标的一些帮助将会有所帮助。

2 个答案:

答案 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`