【问题标题】:Why is this simple if statement failing with "command not found"? [duplicate]为什么这个简单的 if 语句因“找不到命令”而失败? [复制]
【发布时间】:2021-12-31 23:50:04
【问题描述】:

我有一个名为 get-volume.sh 的简单 bash 脚本:

mutedStatus=`amixer -c 0 -D pulse get Master | tail -n 1 | grep -c '\[on\]'`

echo $mutedStatus

if "$mutedStatus" -eq 0; then
    echo 'x'
else
    echo `amixer get Master | awk -F'[]%[]' '/%/ {if ($7 == "off") { print "MM" } else { print $2 }}' | head -n 1`
fi

exit 0

应该

  1. 如果未静音则使用 1 填充 mutedStatus 变量,如果静音则使用 0 填充
  2. 如果静音,则回显“x”,否则回显音量
  3. 退出

但是当我使用bash get-volume.sh 运行脚本时,我收到了这条恼人的消息:

1
get-volume.sh: line 7: 1: command not found
100

为什么会出现这个错误?

它似乎正在尝试执行我的变量,这是 1: 的来源,当我将系统静音时,消息变为

get-volume.sh: line 7: 0: command not found

【问题讨论】:

  • 我认为这只是一个简单的语法错误。见acloudguru.com/blog/engineering/…
  • 看起来你想通了。顺便说一句,第 3 行的命令是在第 3 行立即调用的,而不是在您似乎指出的那样引用变量时。
  • -eq 不是 shell 运算符;这是一个由test 命令解释的参数。您实际上是在尝试使用参数 -eq0 运行名为 1 的命令。
  • shell if 语句中的条件是命令,而不是表达式。如果命令成功,则条件为真,如果失败,则条件为假。 [ 是一个特殊的(通常是内置的)命令,用于计算表达式。
  • 顺便说一句 #!.bin/bash 应该是:#!/bin/bash

标签: bash


【解决方案1】:

解决办法是这样写if语句

...
if [ "$mutedStatus" -eq 0 ] ; then
...

注意[ 之后和] 之前的空格 - 没有这个命令会失败

get-volume.sh:第 7 行:[1:找不到命令

【讨论】:

  • if 语句的其他编写方式包括 if test "$mutedStatus" -eq 0if [[ "$mutedStatus" -eq 0 ]]if (( mutedStatus == 0 ))if let "mutedStatus == 0" 等等。但是为了可移植性,其中之一使用 Posixly 正确的战争,即if [ "$mutedStatus" -eq 0 ]
猜你喜欢
  • 2014-01-16
  • 2017-01-26
  • 1970-01-01
  • 2012-08-09
  • 2020-11-15
  • 2012-09-20
  • 2020-03-23
  • 2016-12-08
  • 2013-12-03
相关资源
最近更新 更多