布尔开关拒绝按预期运行

时间:2014-10-07 03:03:53

标签: bash

我有这个代码,我已经工作了几个小时了,我手动跟着它,它应该打印出来:

  

缺少依赖关系:notacommand

除非它拒绝正常工作,我无法弄清楚原因。我做错了什么?

__DEPENDENCIES=(touch clear sleep ln pacman sed mkdir wget notacommand)
for d in ${__DEPENDENCIES[@]}; do
  for i in $(echo ${PATH} | tr ":" " "); do
    if [ -e "${i}/${d}" ] ; then
      v=true
      break
    else
      v=false
    fi
  done
  if [ v = false ] ; then
    echo "Missing dependency: ${d}"
    exit 1
  fi
done

我道歉,因为我理解发布代码寻求帮助是不好的形式,但我实际上并不知道我的代码首先出现了什么问题所以我甚至不确定该问什么或如何问它

4 个答案:

答案 0 :(得分:2)

你忘记了一个美元符号;)

if [ v = false ]行应为if [ $v = false ]

虽然你的脚本只给了我"缺少依赖性:pacman",当我也应该得到notacommand。

答案 1 :(得分:1)

Bash测试不支持布尔值,因此v是一个字符串变量。使用此:

if [ "$v" = "false" ]; then
    echo "Missing dependency: ${d}"
    exit 1
fi

答案 2 :(得分:1)

虽然您的问题已得到解答,但我有几点建议。

你在循环中做$(echo ${PATH} | tr ":" " "),效率有点低。实际上,这是一种更好的方式来分裂你的道路。下面的脚本将路径元素放入数组中。诀窍是暂时将bash内部字段分隔符设置为:

我还修改了你的文件存在检查,以便它使用空字符串表示false,找到的路径元素字符串表示true。我使用了现代[[样式测试,这些测试比旧的[样式更加用户友好,例如,它们比丢失的"引号更宽容; FWIW,下面的脚本处理包含空格或引号等令人不快的字符的疯狂文件名。 OTOH,[[是一个bash-ism,并非所有炮弹都支持它。

#!/bin/bash

__DEPENDENCIES=(touch clear sleep ln pacman sed mkdir zorg wget notacommand)
IFS=':' paths=($PATH)
# for d in "${paths[@]}"; do echo "[$d]"; done

for d in "${__DEPENDENCIES[@]}"
do
    for i in "${paths[@]}"
    do
        v=''
        if [[ -e $i/$d ]]
            then v=$i; break
        fi
    done

    if [[ -z $v ]]
        then echo "Missing dependency: $d"
        else echo "$d is in $i"
    fi
done

这是一种替代方法,只有在实际可执行时才会找到依赖关系。

#!/bin/bash

__DEPENDENCIES=(touch clear sleep ln pacman sed mkdir zorg wget notacommand)

for f in "${__DEPENDENCIES[@]}"
do 
    echo -n "$f : "
    which "$f" || echo "NOT found!"
done

答案 3 :(得分:0)

您只是重新实现command -v

__DEPENDENCIES=(touch clear sleep ln pacman sed mkdir wget notacommand)
for d in "${__DEPENDENCIES[@]}"; do
  if ! command -v "$d" > /dev/null; then
    echo "Missing dependency: ${d}"
    exit 1
  fi
done
好吧,也许不是。 command仍会找到您可能想要忽略的shell函数,别名等。