Shell:整数表达式应为错误

Shell:整数表达式应为错误,shell,unix,syntax-error,Shell,Unix,Syntax Error,我是Unix环境下编程的初学者,一开始就面临一些困难。我在窗户上用油灰。 这是我的脚本和代码,但当我运行它时,它告诉我 需要整数表达式 它似乎不能正确地与管道或其他东西一起工作;它不会将“日期”转换为原始日期,但我认为它是一个单词。您的代码显示常规引号“…”,而不是反勾号“…”。使用 hour=$(date | cut -c12-13) cut和-c12-13之间的间距很重要。一般来说,使用$(…)比使用反勾号要好(有关原因的讨论,请参阅)。还有,学习,这里的意思是bash-xscript.s

我是Unix环境下编程的初学者,一开始就面临一些困难。我在窗户上用油灰。 这是我的脚本和代码,但当我运行它时,它告诉我

需要整数表达式


它似乎不能正确地与管道或其他东西一起工作;它不会将“日期”转换为原始日期,但我认为它是一个单词。

您的代码显示常规引号
“…”
,而不是反勾号
“…”
。使用

hour=$(date | cut -c12-13)
cut
-c12-13
之间的间距很重要。一般来说,使用
$(…)
比使用反勾号要好(有关原因的讨论,请参阅)。还有,学习,这里的意思是
bash-xscript.sh

在编写代码时,
$hour
中的值是字符串
date | cut-c12-13
(不是命令的输出),它不是整数表达式,因此会显示错误消息。另外,您很可能没有名为
cut-c12-13
的命令,这就是为什么间距在那里很重要



如对问题的评论所示,还有许多其他问题也需要解决,从直接从
date
命令生成所需的信息到在变量引用周围使用双引号,而不是使用不推荐的运算符
-a
-o
,以及
[
,也有人认为你应该优先使用
[…]
,而不是
[…]
,或者特定于Bash的
(…)
,等等。

你的代码显示常规的引号
“…”
,而不是反勾号
`
。使用

hour=$(date | cut -c12-13)
cut
-c12-13
之间的间距很重要。一般来说,使用
$(…)
比使用反勾号要好(请参阅以了解原因的讨论)。此外,在此处学习,这意味着
bash-x script.sh

在编写代码时,
$hour
中的值是字符串
date | cut-c12-13
(不是命令的输出),它不是一个整数表达式,因此会显示错误消息。此外,您很可能没有名为
cut-c12-13
的命令,这就是间距在那里很重要的原因



如对问题的评论所示,还有许多其他问题也需要解决,从直接从
date
命令生成所需的信息到在变量引用周围使用双引号,而不是使用不推荐的运算符
-a
-o
,以及
[
,有些人认为应该优先使用
[…]
,而不是
[…]
,或者特定于Bash的
(…)
,等等。

也许有必要解释一下
$()
比反勾号更好,因为它可以很容易地嵌套,也因为引用更容易处理。而且,阅读您代码的人不会无意中认为您键入了单引号。:@dannysauer:我在讨论该问题的问题中添加了一个x-ref。非常感谢,明白了。就bash-x script.sh而言将chmod+x设为ok ithing@Georgez:请注意,
bash-x script.sh
在脚本运行时为您提供脚本正在执行的操作的跟踪;它相当于在脚本中作为语句运行
set-x
。它独立于脚本上的权限。可能值得解释一下
$()
比反勾号更好,因为它可以很容易地嵌套,也因为引用更容易处理。而且,阅读您代码的人不会无意中认为您键入了单引号。:@dannysauer:我在讨论该问题的问题中添加了一个x-ref。非常感谢,明白了。就bash-x script.sh而言将chmod+x设为ok ithing@Georgez:请注意,
bash-x script.sh
在脚本运行时为您提供脚本正在执行的操作的跟踪;它相当于在脚本中作为语句运行
set-x
。它独立于脚本上的权限。另外,使用
-a
作为“和”在当前版本的POSIX规范中,运算符被明确标记为已过时。如果您希望与POSIX兼容,请使用
[“$hour”-ge 0]&&&&&[“$hour”-lt 12]
,或者使用
((hour>=0&&hour<12))
来利用现代(可读性更强)技术bash特定语法…请参阅POSIX测试规范;
-a
-o
旁边的
OB
标志将它们标记为过时,而
XSI
标志将它们标记为基线POSIX标准的扩展(因此并非所有系统都需要从一开始就支持它们)。(哦,还有引用事项;
[$hour-ge 0]
[“$hour”-ge 0]
不是一回事:后者在许多常见情况下允许更好的错误消息,并防止在更罕见的情况下出现完全不正确的结果。将为您捕获各种各样的错误)。您肯定希望
hour=$(日期+'%H)“
而不是使用
cut
…而且似乎不太可能得到一个负小时,因此小于零的测试也有点奇怪。进一步说,在当前版本的POSIX规范中,使用
-a
作为“and”运算符会显式标记为过时。使用
[“$hour”-ge 0]&[“$hour”-lt 12]
相反,如果您希望与POSIX兼容,或者
((小时>=0&&hour<12))
利用现代(更具可读性)bash特定语法…请参阅POSIX测试规范;
-a
-o
旁边的
OB
标志将它们标记为过时,而
XSI
标志将它们标记为基线POSIX标准的扩展(因此并非所有系统都需要从一开始就支持它们)。(哦,还有引用事项;
[$hour-ge 0]
[“$hour”-ge 0]
不是一回事:后者允许更好的错误消息