Как я могу проверить файл, имеющий значение?

я использую

source ~/.rvm/scripts/rvm repos="repo_1_ruby_193 repo_2_ruby_211 repo_3_ruby_191" > rvm_check.txt for repo in $repos do cd ~/zipcar/$repo 2>rvm_check.txt cd .. echo $repo if [ -z `cat rvm_check.txt | grep not` ] # line 9 then echo "YES" else echo "NO" exit 1 fi done 

и это в основном работает, но я получаю:

 $ ./multi_repo_rubies.sh repo_1_ruby_193 YES repo_2_ruby_211 YES repo_3_ruby_191 ./multi_repo_rubies.sh: line 9: [: too many arguments NO $ 

я пытаюсь -s или -z

Я получаю ДА / НЕТ, что хочу, но как избежать [: ошибка?

2 Solutions collect form web for “Как я могу проверить файл, имеющий значение?”

Заменить:

 if [ -z `cat rvm_check.txt | grep not` ] 

С:

 if ! grep -q not rvm_check.txt 

Причина использования test в выражении if состоит в том, что он устанавливает код выхода, который использует оболочка, чтобы решить перейти к предложению then или else . grep также устанавливает код выхода. Следовательно, нет необходимости в тестировании [ , здесь. grep устанавливает код выхода для успеха (0), если он нашел строку. Вы хотите добиться успеха, если строка не найдена. Таким образом, мы отрицаем результат кода выхода, используя ! ,

объяснение

Команда test, [ , ожидает, что одна строка будет следовать за -z . Если команда grep производит более одного слова, тогда тест завершится с ошибкой, которую вы видели.

В качестве примера рассмотрим этот пример файла:

 $ cat rvm_check.txt one not two 

Результат grep выглядит так:

 $ cat rvm_check.txt | grep not one not two 

Когда test выполняется, все три слова появляются внутри [...] приводит к сбою команды:

 $ [ -z `cat rvm_check.txt | grep not` ] bash: [: too many arguments 

Это точно так же, как если бы вы ввели:

 $ [ -z one not two ] bash: [: too many arguments 

Одним из решений для этого является использование двойных кавычек:

 $ [ -z "`cat rvm_check.txt | grep not`" ] 

Двойные кавычки не позволяют оболочке выполнять разбиение слов . В результате вывод grep здесь обрабатывается как одна строка, а не разделяется на отдельные слова.

Однако, поскольку grep устанавливает разумный код выхода, как показано в рекомендуемой строке выше, нет необходимости в тестировании.

Дополнительные комментарии

  • В настоящее время предпочтительной формой для подстановки команд является $(...) . Хотя backticks все еще работают, они хрупкие. В частности, backticks не могут быть вложенными.

  • В командах, которые принимают имена файлов в команде, использование cat не нужно. Вместо:

     cat somefile | grep something 

    Просто используйте:

     grep something somefile 

Я закончил тем, что использовал:

 if [ -f ~/.rvm/scripts/rvm ]; then . ~/.rvm/scripts/rvm else echo echo --- FAIL --- echo echo "You do not have a standard RVM install, cannot procede" echo "Please install rvm locally and re-run this program" exit 1 fi repos="repo_3_ruby_191 repo_1_ruby_193 repo_2_ruby_211" for repo in $repos do if [ ! -f ~/zipcar/$repo/.ruby-version ]; then echo echo --- WARN ---- echo echo No .ruby-version file present for $repo echo This *might* be an issue if there are ruby, eg rspec, tests. echo If so, please add and commit a .ruby-version file to $repo echo else version=$(cat ~/zipcar/$repo/.ruby-version) echo Checking ruby version: $version for repository: $repo"..." cd ~/zipcar/$repo 2>rvm_check.txt.$$ if grep -qi 'not installed' ../rvm_check.txt.$$; then echo echo --- FAIL --- echo echo The required ruby version for $repo was not present on this machine echo Please install it with echo echo " "RVM install $version echo echo and then re-run this program echo exit 1 else echo $version Installed fi fi done echo echo All required ruby versions verified as present through RVM 
  • Экспортирование переменной с точкой (.) В ней
  • Упрощенная навигация в терминале
  • Постоянное переключение на zsh в скрипте, без root и без запроса пароля
  • Меню KSH, основанное на тексте, с использованием STDERR
  • Является ли трубопровод из простых команд?
  • Убейте процесс, если он успокоится в течение определенного времени
  • Трубы Дженкинса, ш, кавычки и пробелы
  • Как запустить sh из файла sh
  • 'ls -1': список имен файлов без расширения
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Практическое использование команды «shift» shell builtin?
  • Linux и Unix - лучшая ОС в мире.