Bash脚本抛出太多参数错误

时间:2014-05-07 19:41:31

标签: bash less

我有这个看起来像这样的bash脚本

#!/bin/bash

for f in src/styles/*.less src/styles/brand/*.less
do
  filename=$(basename "$f")
  if [ ${filename:0:1} != '_' ]; then
    lessc --no-color -x "${f}" "$(sed 's|^src/styles/|httpdocs/css/|;s/.less$/.css/' <<< $f)"
  fi
done

我想应该在样式和品牌目录中编译一系列.less文件。当我运行它时,我明白了:

./compile_less.sh: line 6: [: too many arguments

知道这里出了什么问题吗?我是一个带有bash脚本的newb,并且正在使用前一个同事的这个。

谢谢!

2 个答案:

答案 0 :(得分:2)

现有的答案解决了最佳实践问题,但没有解释为什么这是一个太多的参数错误。

"${filename:0:1}"需要双引号,如果你想确保它总是一个单词,而不是零单词或几个单词 - 如果它是空的,那就是零单词,所以你运行{{1} }。

如果第一个字符是[ != _ ],则退出引号会更糟 - 然后它会在当前目录中的每个文件扩展为一个单词,并且太多操作数。

*参数太多,因为没有任何东西可以成为二元运算符,因此[ != _ ]期望只看到一个操作数。

[对于一个不那么微妙的原因来说是太多的论据。 :)

答案 1 :(得分:1)

使用

的问题
for f in src/styles/*.less src/styles/brand/*.less

如果没有文件匹配,那么f将是src/styles/*.less src/styles/brand/*.lessfilename将是*.less。这会导致if语句中出现问题。

您可以检查文件是否存在并继续:

  ...
  [[ ! -e "${f}" ]] && continue # or any other appropriate action 
  filename=$(basename "$f")
  ...