2015-05-05 1 views
2

Я новичок в сценариях оболочки, и у меня возникают проблемы при использовании команды «test» и специальной символ * для сравнения двух строк.Сообщение «test: too many arguments» из-за специального символа * при использовании команды test в bash для сравнения двух строк

Мне нужно написать сценарий оболочки, который для каждого элемента (обоих файлов и каталогов), содержащегося в каталоге, переданном в качестве первого аргумента, должен что-то написать (для решения моей проблемы не имеет значения знать, что должно быть записано) в файле «summary.out». Более того, в качестве второго аргумента есть строка. Эти файлы/каталоги, начинающиеся с этой строки, должны игнорироваться (ничто не должно быть написано на summary.out).

Вот код:

#!/bin/bash 
TEMP=NULL 
cd "$1" 
for i in * 
    do 
     if test "$i" != "$2"*;then #Here is where the error comes from 
      if test -f "$i";then 
       TEMP="$i - `head -c 10 "$i"`" 
      elif test -d "$i";then 
       TEMP="$i - `ls -1 "$i" | wc -l`" 
      fi 
      echo $TEMP >> summary.out 
     fi 
done 

ошибка происходит из теста, который проверяет, начинается ли текущий файл/каталог со строкой, переданной в качестве второго аргумента, и это происходит каждую итерацию для цикла. В нем говорится: «test: too many arguments»

Теперь я провел несколько тестов, которые показали, что проблема не имеет ничего общего с пустым пространством внутри $ i или $ 1. Проблема связана с тем, что я использую специальный символ * в тесте (если я его удалю, все работает нормально).

Почему нельзя «проверять» ручку *? Что я могу сделать, чтобы исправить это?

+0

http://www.tldp.org/LDP/abs/html/special-chars.html#ASTERISKREF –

+0

Вы можете использовать 'сделано> summary.out' вместо' >> summary.out' к избегайте многократного открытия и закрытия файла в цикле. –

ответ

2

* распространяется под оболочкой.

В bash вы можете использовать [[ ... ]] для условий, а не test. Они поддерживают шаблоны с правой стороны - * не расширяется, так как двойные квадратные скобки - это ключевое слово с более высоким приоритетом.

if [[ a == * ]] ; then 
    echo Matches 
else 
    echo Doesn\'t match 
fi 
+0

echo - встроенный и 'echo *' определенно расширяется, этот ответ очень вводит в заблуждение. –

+0

@JID: Извините, 's/builtin/keyword /'. Исправлена. – choroba

+0

Это все еще довольно вводящий в заблуждение '*' не расширяется, потому что это аргумент для тестирования (также тест FWIW - это bultin). Он все время расширяется с помощью чего-либо, если только что-то с более высоким приоритетом сначала не переписывается (например, '' '' '' '' или '[[]]'), а затем не позволяет ему это сделать. В качестве аргумента для 'if ', другое ключевое слово, оно будет расширяться так же, как и с чем-либо еще. –

Смежные вопросы