我试图查看shell脚本的工作方式以及如何运行它们,因此我从从库中选出的一本名为《 Wicked Cool Shell Scripts》的书中摘录了一些示例代码。

我按原样重新编写了代码,但是从Linux中得到了一个错误,我在编译该代码时说:


  'd.sh:第3行:意外令牌`{附近的语法错误
  
  'd.sh:第3行:`gmk(){


在此之前,我在换行符上花了大括号,但是我仍然得到:


  'd.sh:第3行:意外令牌附近的语法错误
  
  d.sh:第3行:`gmk()


#!/bin/sh
#format directory- outputs a formatted directory listing
gmk()
 {
#Give input in Kb, output converted to Kb, Mb, or Gb for best output format
    if [$1 -ge 1000000]; then
        echo "$(scriptbc -p 2 $1/1000000)Gb"
    elif [$1 - ge 1000]; then
        echo "$$(scriptbc -p 2 $1/1000)Mb"
    else
        echo "${1}Kb"
        fi
}

    if [$# -gt 1] ; then
        echo "Usage: $0 [dirname]" >&2; exit 1
    elif [$# -eq 1] ; then
        cd "$@"
        fi

    for file in *

    do
        if [-d "$file"] ; then
            size = $(ls "$file"|wc -l|sed 's/[^[:digit:]]//g')
        elif [$size -eq 1] ; then
            echo "$file ($size entry)|"
        else
            echo "$file ($size entries)|"
    fi
        else
            size ="$(ls -sk "$file" | awk '{print $1}')"
            echo "$file ($(gmk $size))|"
    fi
    done | \
      sed 's/ /^^^/g' |\
      xargs -n 2 |\
      sed 's/\^\^\^/ /g' | \
      awk -F\| '{ printf "%39s %-39s\n", $1, $2}'
      exit 0

    if [$#-gt 1]; then
        echo "Usage :$0 [dirname]" >&2; exit 1
    elif [$# -eq 1]; then
        cd "$@"
    fi

    for file in *
        do
            if [ -d "$file" ] ; then
                size =$(ls "$file" | wc -l | sed 's/[^[:digit:]]//g')
            if [ $size -eq 1 ] ; then
                echo "$file ($size entry)|"
            else
                echo "$file ($size entries)|"
                fi
            else
                size ="$(ls -sk "$file" | awk '{print $1}')"
                echo "$file ($(convert $size))|"
                fi
done | \
    sed 's/ /^^^/g' | \
    xargs -n 2 | \
    sed 's/\^\^\^/ /g' | \
    awk -F\| '{ printf "%-39s %-39s\n", $1, $2 }'

    exit 0

最佳答案

sh对空格非常敏感。特别是分配(=周围没有空格)和测试([ ]内必须有空格)。

此版本运行,尽管由于缺少scriptbc在我的计算机上失败。

您将elsif放在应该是if的位置。

注意起点和终点之间的列对齐。如果它们不匹配,则很容易使您误入歧途。

另外,在脚本顶部附近添加set -x是调试其操作的一种非常好的方法-它将导致解释器在执行之前输出要运行的每一行。

#!/bin/sh
#format directory- outputs a formatted directory listing
gmk()
{
#Give input in Kb, output converted to Kb, Mb, or Gb for best output format
    if [ $1 -ge 1000000 ]; then
        echo "$(scriptbc -p 2 $1/1000000)Gb"
    elif [ $1 -ge 1000 ]; then
        echo "$(scriptbc -p 2 $1/1000)Mb"
    else
        echo "${1}Kb"
    fi
}

if [ $# -gt 1 ] ; then
    echo "Usage: $0 [dirname]" >&2; exit 1
elif [ $# -eq 1 ] ; then
    cd "$@"
fi

for file in *
do
    if [ -d "$file" ] ; then
        size=$(ls "$file"|wc -l|sed 's/[^[:digit:]]//g')
        if [ $size -eq 1 ] ; then
            echo "$file ($size entry)|"
        else
            echo "$file ($size entries)|"
        fi
    else
        size="$(ls -sk "$file" | awk '{print $1}')"
        echo "$file ($(gmk $size))|"
    fi
done | \
  sed 's/ /^^^/g' |\
  xargs -n 2 |\
  sed 's/\^\^\^/ /g' | \
  awk -F\| '{ printf "%39s %-39s\n", $1, $2}'
  exit 0

关于linux - 为什么使用此示例脚本,并在 token 附近不断输出错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18051283/

10-11 22:39
查看更多