Строковое сравнение оператора if - строка пустая

У меня проблема с проверкой, пуста ли строка.
Я получаю первый столбец информации ls -l и пытаюсь grep найти строку «x». Если строка пуста, я должен считать. Но когда строка пуста или нет, я все равно получаю код выхода 0 для этого оператора if.

Если я использую команду ls -l $1 | awk '{print $1}', я получаю -rw-r--r--, а когда получаю grep, я получаю пустую строку.

#!/bin/sh

test= ` ls -l $1 | awk '{print $1}' | grep x ` ;
if [ -n $test ];
echo "file is not executable";

Примечания:

  1. скрипт используется в учебных целях, чтобы заставить код работать без опции [-x file].
  2. Сценарий написан в оболочке, а не Bash.
  3. Если вам лень пролистывать, есть фиксированный фрагмент кода:

      #!/bin/sh
      PartOfString=` file $1 | awk '{print $2}' `;
      if [ $PartOfString == executable ];
      then
      echo "file is executable";
      else
      echo "file is not executable or its not file";
      fi
    
0
задан 19 April 2016 в 17:23

3 ответа

Код, который Вы используете, имеет несколько проблем:

  1. не рекомендуется проанализировать ls, но давайте сохраним его на данный момент, так как это не имеет никакого отношения к Вашей проблеме.
  2. Используя `` для выполнения работ команд, но старый стиль и должно быть замененное остроумие $(). Не очень важный здесь, но возможно стоящий упоминания для будущего.
  3. Ваш if - конструкция имеет неправильный синтаксис. Это отсутствует then и fi.
  4. способ, которым Вы используете -n, является неправильным. -n тесты, если строка не пуста.

Вот улучшенная версия:

#!/bin/sh                                       

testString=$(ls -l $1 | awk '{print $1}' | grep x)
if [ -n "$testString" ]
then
    echo "file is executable"
else
    echo "file is not executable"
fi
<час>

вопрос об обработке строк и использует исполняемый флаг только в качестве примера, но я все еще хочу упомянуть рекомендуемый способ проверить, является ли файл исполняемым файлом:

#!/bin/bash
file="$1"

if [[ -x "$file" ]]
then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
fi
4
ответ дан 20 April 2016 в 03:23
  • 1
    Спасибо, который разрешает различие между Ящиком исходящих сообщений и Отправленными Объектами. Когда, когда я посылаю электронное письмо, не появляется ни в одной из этих папок, и если я пытаюсь сохранить электронное письмо как проект, это не появляется в моей Папке черновиков. I' m не уверенный, что могло идти не так, как надо, если это просто локальные папки. Эволюция имеет установку для определения моих локальных почтовых папок? – David Pitchford 2 September 2017 в 02:14

Является ненужным использовать ls и awk для тестирования, если файл является исполняемым файлом, используйте флаг-x с тестом

  [ -x $1 ] && echo executable || echo not executable
1
ответ дан 20 April 2016 в 03:23
  • 1
    Я не использовал Эволюцию, я использую Thunderbird, но обычно клиент создает локальные папки сам. и они перечислены под папками сервера – ravery 2 September 2017 в 03:20

Таким образом, я наконец нашел решение.

теперь фрагмент кода похож на это:

#!/bin/sh

test=` file $1 | awk '{print $2}' `;
if [ $test == executable ];
then
echo "file is executable";
else
echo "file is not executable or its not file";
fi

примечание, что ожидается, что первым аргументом является файл, который Вы хотите проверить. Идея этого кода состоит в том, чтобы проверить, является ли файл исполняемым файлом, не используя-x опцию. Если Вы ищущий продуктивный код а не для академического, используйте метод Wayne_Yux, описанный прежде.

0
ответ дан 20 April 2016 в 03:23
  • 1
    Привет Charles, я значительно отредактировал вопрос и теперь также обеспечил вывод, который я вижу, когда я " просмотрите файл, соответствующий runlcactivator". предложите командную строку " произведите чистку программы и scripts". – AyBee 11 September 2017 в 19:15

Другие вопросы по тегам:

Похожие вопросы: