0

在此处输入图像描述我试图了解 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

书中出现的代码

4

2 回答 2

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
于 2013-08-05T09:25:20.160 回答
0

顺便说一句,关于告诉您修改 PATH 变量的书,这确实是一个坏主意,具体取决于它建议您做什么。为了清楚起见,切勿将当前目录添加到 PATH 变量中,除非您打算将该目录设置为所有脚本的永久位置等。如果您要将其设置为脚本的永久位置,请确保将该位置添加到PATH 变量的 END,而不是开始,否则您将产生重大的安全问题。

Linux 和 Unix 不会将您的当前位置(通常称为您的 PWD 或当前工作目录)添加到路径中,因为有人可以创建一个名为“ls”的脚本,例如,它可能会运行恶意内容而不是实际的“ls”命令. 在 PWD 中执行某些内容的正确方法是在其前面加上“./”(例如 ./my_new_script.sh)。这基本上表明您确实想从您的 PWD 运行某些东西。把它想象成告诉shell“就在这里”。这 '。' 实际上代表您当前的目录,换句话说就是“这里”。

于 2013-12-12T17:35:00.153 回答