我有这个看起来像这样的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,并且正在使用前一个同事的这个。
谢谢!
答案 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/*.less
而filename
将是*.less
。这会导致if
语句中出现问题。
您可以检查文件是否存在并继续:
...
[[ ! -e "${f}" ]] && continue # or any other appropriate action
filename=$(basename "$f")
...