Проверьте, не имеет ли строка символов без пробелов в Bash
Мой script читает и отображает теги id3. Я пытаюсь заставить его эхо неизвестно, если поле пустое, но каждый оператор if не работает. Теги id3 являются фиксированным размером, поэтому они никогда не являются нулевыми, но если нет значения, они заполняются пробелом. I.E тег заголовка имеет длину 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::
script
#!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
Ответы
Ответ 1
Вы можете использовать синтаксис bash regex.
Это требует, чтобы вы использовали двойные квадратные скобки [[ ... ]]
, (более универсальные, в общем).
Переменная не обязательно должна указываться. Саморежим не должен
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
Выход
Has length, and contain only whitespace " "
Is either null or contain non-whitespace "abc "
Is either null or contain non-whitespace ""
Ответ 2
Многие из этих ответов намного сложнее или гораздо менее читабельны, чем они должны быть.
[[ $string = *[[:space:]]* ]] && echo "String contains whitespace"
[[ $string = *[![:space:]]* ]] && echo "String contains non-whitespace"
Ответ 3
Нестандартный вариант оболочки bash:
case "$string" in
*[!\ ]*) echo "known";;
*) echo "unknown";;
esac
Ответ 4
С включенными расширенными шарами (shopt -s extglob
):
if [ -n "${string##+([[:space:]])}" ]; then
echo '$string has non-whitespace characters'
fi
Ответ 5
[[ -z `echo $string` ]]
Backquotes выполняет команду внутри; 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
Ответ 6
if [ "$(echo "$string" | tr -s ' ')" == " " ]; then
echo "all white space"
fi
Это сжимает все повторяющиеся пробелы до одного пробела и сравнивается для этого.
Ответ 7
Этот параметр проверяет длину нуля или пробел или табуляцию
S="Something"
if [[ "x$S" == "x" || "x$S" == x*\ * || "x$S" == x*\ * ]] ;then
echo "Is not OK"
else
echo "Is OK"
fi
Ответ 8
Совместное использование более переносимого метода, не требующего двойных скобок [[]], при этом максимально упрощая его.
Определить строку, содержащую ТОЛЬКО пробелы или = нуль:
if [ -z "${string// }" ]; then <do something>; fi
Который в этом случае будет:
${var// }
Такие как:
if [ -z "${string// }" ]; then echo "It empty!"; fi
То, что это делает, просто заменяет все пустое пространство нулем через подстановку. Если $ string содержит только пробел, тест -z оценивает TRUE. Если в строке есть символы, не являющиеся пробелами, уравнение оценивается как ЛОЖЬ.
Дальнейшее развитие BASH (поскольку OP спрашивал об этом в BASH), в приведенном выше примере не будут отображаться вкладки, хотя это можно сделать. Вот еще примеры в BASH, которые работают и не работают, как ожидалось.
Допустим, есть вкладка в строке поиска.
Это работает:
string=$(echo -e "\t"); if [ -z ${string// } ]; then echo "It empty!"; fi
Но это не так:
string=$(echo -e "\t"); if [ -z "${string// }" ]; then echo "It empty!"; fi
string=$(echo -e "\t"); if [ -z '${string// }' ]; then echo "It empty!"; fi
Оба последних примера, приведенные выше, сообщают, что строка не пуста. Если вы считаете вкладку пустым пространством, это будет проблемой, и вы захотите использовать первый пример.
Что насчет перевода строки? Давайте посмотрим на сценарий \n
. Во-первых, "правильное" поведение зависит от ваших ожиданий.
Они обрабатывают символы новой строки (\n
) как пробел (уравнение оценивает TRUE):
string=$(echo -e "\n\n"); if [ -z ${string// } ]; then echo "It empty!"; fi
string=$(echo -e "\n\n"); if [ -z "${string// }" ]; then echo "It empty!"; fi
Это не так (уравнение оценивается как ЛОЖЬ), означающее, что это уравнение думает, что перевод строки не является пробелом.
string=$(echo -e "\n\n"); if [ -z '${string// }' ]; then echo "It empty!"; fi
Если вам требуется проверка перехода на новую строку, табуляции и пробелов, вам может потребоваться использовать два оператора IF/THEN или метод CASE, описанный выше.