bash脚本语法将字符串作为整数进行比较

时间:2015-03-12 22:47:58

标签: linux bash shell

我有一个bash脚本我试图通过目录运行到行的末尾,例如,如果我连续有4个目录,它将关闭/ d1 / d2 / d3 / d4,直到找到文件或其他目录。如果d3有一个文件,它将停在那里。我这样做是通过计算ls打印到文件的行,如果有1个目录在cd命令中使用该名称。 我的档案是:

`

#!/bin/bash


COUNTFILE="/home/username/fake.txt"

ITEMCOUNT=$(ls | wc -l)
echo "ITEMCOUNT" $ITEMCOUNT

echo $*

ONE="1"
echo "one" $ONE

if [["$ITEMCOUNT" -eq "$ONE"]]; 
then
  DIRCOUNT=$(find . -maxdepth 1 -type d | wc -l)
  echo "dircount" $DIRCOUNT
else
  DIRCOUNT="0"
fi


if [$DIRCOUNT == "1"]; then
  ls > $COUNTFILE
  PATH=$(head -1 $COUNTFILE)
  cd ./$PATH
fi

`

我一如既往

pipetester.sh: line 15: [[1: command not found
pipetester.sh: line 2

4:[0:命令未找到

我检查了2个小时的语法,但它似乎在抱怨我的"如果"为什么?

2 个答案:

答案 0 :(得分:5)

[[[等命令名称周围添加空格。

例如:

if [[ "$ITEMCOUNT" -eq "$ONE" ]]
then

或者,如果你喜欢分号:

if [[ "$ITEMCOUNT" -eq "$ONE" ]]; then

if [ $DIRCOUNT == "1" ]; then

或(更好地使用引号):

if [ "$DIRCOUNT" == "1" ]; then  # Or just 1 (no quotes around it)

因为这些是命令,所以表达式的组件周围也需要空格(就像你已经拥有它们一样)。不要在shell脚本中使用空格(但也不要在不允许的地方使用它们,例如在变量赋值中的=周围)。

请注意,[[命令和== [运算符都是Bash扩展名,与POSIX shell相比。

答案 1 :(得分:1)

您需要在[[]]代币周围放置空格,[[是一个实际的命令:

if [[ "$ITEMCOUNT" -eq "$ONE" ]];

现在你拥有它的方式与期待ls-al-之前没有空格)给你一个完整的目录列表没什么不同。

有关[[1命令的投诉是因为$ITEMCOUNT设置为1并且与[[文本合并:

pax$ xyzzy=1

pax$ if [[$xyzzy == 1]]; then echo yes; fi
-bash: [[1: command not found

pax$ if [[ $xyzzy == 1 ]]; then echo yes; fi
yes

出于同样的原因,您还需要为[]执行此操作。