Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么这个示例脚本在令牌附近不断输出错误?_Linux_Shell - Fatal编程技术网

Linux 为什么这个示例脚本在令牌附近不断输出错误?

Linux 为什么这个示例脚本在令牌附近不断输出错误?,linux,shell,Linux,Shell,在这里输入图像描述我试图了解shell脚本如何工作以及如何运行它们,因此我从我从库中挑选的一本名为“邪恶酷炫的shell脚本”的书中提取了一些示例代码 我一字不差地重新编写了代码,但我从Linux得到了一个错误,我编译代码时说: 'd.sh:第3行:意外标记附近的语法错误`{ 'd.sh:第3行:'gmk(){ 在此之前,我在新词中使用了花括号,但我仍然得到: 'd.sh:第3行:意外标记附近的语法错误 'd.sh:第3行:'gmk() sh对空格非常敏感。特别是赋值(在=周围没有空格)和测试(

在这里输入图像描述我试图了解shell脚本如何工作以及如何运行它们,因此我从我从库中挑选的一本名为“邪恶酷炫的shell脚本”的书中提取了一些示例代码

我一字不差地重新编写了代码,但我从Linux得到了一个错误,我编译代码时说:

'd.sh:第3行:意外标记附近的语法错误`{

'd.sh:第3行:'gmk(){

在此之前,我在新词中使用了花括号,但我仍然得到:

'd.sh:第3行:意外标记附近的语法错误

'd.sh:第3行:'gmk()

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

顺便说一句,这本书告诉你修改PATH变量,这确实是一个坏主意,具体取决于它建议你做什么。只是要明确一点,永远不要将当前目录添加到PATH变量中,除非你打算将该目录作为所有脚本等的永久位置永久位置对于脚本,请确保将位置添加到PATH变量的末尾,而不是开头,否则会造成严重的安全问题


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

这是一个严重的问题。首先,在
[
]
周围放置空格"汇编,"代码,你的确切意思是什么?@devnull我把空格放在了像你一样的地方suggested@GabeCompile可能不是正确的词,只是习惯于这么说。我尝试使用我的另一本linux书籍建议的/bin/sh filename运行脚本,我还尝试使用chmod+x filename运行脚本,然后键入文件名,但不断得到一个路径错误r、 书中说可能会发生这种情况,他们建议PATH=$PATH然后运行文件名,但它仍然不起作用。你在Linux程序中键入的代码是什么?谢谢,在我能够对我的目录进行一些调整后,它实际上起了作用。它确实输出了一些关于脚本bc的错误,但输出仍然正确
#!/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