我有一个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个小时的语法,但它似乎在抱怨我的"如果"为什么?
答案 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
出于同样的原因,您还需要为[
和]
执行此操作。