Проверьте, есть ли в строке не пробельные символы в Bash - PullRequest
21 голосов
/ 19 марта 2012

Мой скрипт читает и отображает теги id3.Я пытаюсь заставить его отображать эхо неизвестного, если поле пустое, но каждое выражение if, которое я пробую, не будет работать.Теги id3 имеют фиксированный размер, поэтому они никогда не бывают нулевыми, но если значения отсутствуют, они заполняются пробелами.IE заголовок тега имеет длину 30 символов.До сих пор я пробовал

echo :$string: #outputs spaces between the 2 ::

if [ -z "$string" ] #because of white space will always evaluate to true

x=echo $string | tr -d ' '; if [ -z "$string" ]; # все еще оценивается как true, но echos: $ x: it echos ::

сценарий

#!bin/bash
echo "$# files";
while [ "$i" != "" ];
do
   TAG=`tail -c 128 "$i" | head -c 3`;
   if [ $TAG="TAG" ]
   then
      ID3[0]=`tail -c 125 "$1" | head -c 30`;
      ID3[1]=`tail -c 95 "$1" | head -c 30`;
      ID3[2]=`tail -c 65 "$1" | head -c 30`;
      ID3[3]=`tail -c 35 "$1" | head 4`;
      ID3[4]=`tail -c 31 "$i" | head -c 28`;
      for i in "${ID3[@]}"
      do
         if [ "$(echo $i)" ] #the if statement mentioned
         then
            echo "N/A";
         else
            echo ":$i:";
         fi
      done
   else
      echo "$i does not have a proper id3 tag";
   fi
   shift;
done

Ответы [ 8 ]

30 голосов
/ 25 июня 2013

Многие из этих ответов намного сложнее или менее читабельны, чем они должны быть.

[[ $string = *[[:space:]]* ]]  && echo "String contains whitespace"
[[ $string = *[![:space:]]* ]] && echo "String contains non-whitespace"
7 голосов
/ 19 марта 2012

Вы можете использовать синтаксис bash для регулярных выражений.

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

for str in "         "  "abc      " "" ;do
    if [[ $str =~ ^\ +$ ]] ;then 
      echo -e "Has length, and contain only whitespace  \"$str\"" 
    else 
      echo -e "Is either null or contain non-whitespace \"$str\" "
    fi
done

Output

Has length, and contain only whitespace  "         "
Is either null or contain non-whitespace "abc      " 
Is either null or contain non-whitespace "" 
3 голосов
/ 19 марта 2012

Не для bash, вариант только для оболочки:

case "$string" in
 *[!\ ]*) echo "known";;
 *) echo "unknown";;
esac
1 голос
/ 26 ноября 2017
[[ -z `echo $string` ]]

Обратные кавычки выполняют команду внутри;Анализ строки bash преобразует табуляции и переводы строк в пробелы и объединяет двойные пробелы.Команда echo повторно выдает эту строку, которая сокращается до пустой строки для окончательного теста [[]].Я думаю, что это самое короткое решение, которое принимает следующее:

> VAR="$(echo -e " \n\t")"
> [[ -z  `echo $VAR` ]] ; echo $?
0
> VAR="$(echo -e " \na\t")"
> [[ -z  `echo $VAR` ]] ; echo $?
1
> VAR="$(echo -e "aaa bbb")"
> [[ -z  `echo $VAR` ]] ; echo $?
1
> VAR=
> [[ -z  `echo $VAR` ]] ; echo $?
0
1 голос
/ 19 марта 2012

С включенными расширенными глобусами (shopt -s extglob):

if [ -n "${string##+([[:space:]])}" ]; then
    echo '$string has non-whitespace characters'
fi
0 голосов
/ 09 января 2019

Совместное использование более переносимого метода, не требующего двойных скобок [[]], при этом максимально упрощая его.

Обнаружение строки, содержащей ТОЛЬКО пробелы или = ноль:

if [ -z "${string// }" ]; then <do something>; fi

Что в этом случае будет:

${var// }

Например:

if [ -z "${string// }" ]; then echo "It's empty!"; fi

То, что это делает, просто заменяет все пустое пространство нулем через подстановку.Если $ string содержит только пробел, тест -z оценивает TRUE.Если в строке есть непробельные символы, уравнение оценивается как ЛОЖЬ.

Дальнейшая разработка BASH (так как OP спросил об этом в BASH), в приведенном выше примере не будут ловить вкладки, хотя это возможносделать это.Вот еще примеры в BASH, которые работают и работают не так, как ожидалось.

Допустим, в строке поиска есть вкладка.

Это работает:

string=$(echo -e "\t"); if [ -z ${string// } ]; then echo "It's empty!"; fi

Но это не так:

string=$(echo -e "\t"); if [ -z "${string// }" ]; then echo "It's empty!"; fi
string=$(echo -e "\t"); if [ -z '${string// }' ]; then echo "It's empty!"; fi

Два последних примера, приведенные выше, сообщают, что строка не пуста.Если вы считаете, что табуляция является пробелом, это будет проблемой, и вы захотите использовать первый пример.

Как насчет перевода строки?Давайте посмотрим на сценарий \n.Во-первых, «правильное» поведение зависит от ваших ожиданий.

Они обрабатывают символы новой строки (\n) как пробел (уравнение оценивает ИСТИНА):

string=$(echo -e "\n\n"); if [ -z ${string// } ]; then echo "It's empty!"; fi
string=$(echo -e "\n\n"); if [ -z "${string// }" ]; then echo "It's empty!"; fi

Это не так (уравнение оценивается как ЛОЖЬ), то есть это уравнение думает, что новая строкане пробел.

string=$(echo -e "\n\n"); if [ -z '${string// }' ]; then echo "It's empty!"; fi

Если вам требуется проверка на наличие новых строк, вкладок и пробелов, вам может понадобиться использовать два оператора IF / THEN или метод CASE, описанный выше.

0 голосов
/ 25 июня 2013

Этот проверяет наличие нулевой длины или пробела или табуляции

S="Something"
if [[ "x$S" == "x" || "x$S" == x*\ * || "x$S" == x*\    * ]] ;then
  echo "Is not OK"
else
  echo "Is OK"
fi
0 голосов
/ 19 марта 2012
if [ "$(echo "$string" | tr -s ' ')" == " " ]; then
  echo "all white space"
fi

Сжимает все повторяющиеся пробелы до одного пробела и сравнивает для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...