gpt4 book ai didi

linux - 为什么这个示例脚本在 token 附近不断输出错误?

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:14 26 4
gpt4 key购买 nike

在此处输入图像描述我试图了解 shell 脚本如何工作以及如何运行它们,因此我从我从名为“Wicked Cool Shell Scripts”的图书馆中挑选的书中获取了一些示例代码

我逐字重新编写了代码,但我从 Linux 中收到了一个错误,我编译了代码:

'd.sh: line 3: syntax error near unexpected token `{

'd.sh: line 3:`gmk() {

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

'd.sh: line 3: syntax error near unexpected token

'd.sh: line 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

the code as it appears in the book

最佳答案

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com