Перевірте, чи у рядку сценарію оболонки рядок не порожній і не пробіл


92

Я намагаюся запустити наступний сценарій оболонки, який повинен перевірити, чи рядок не є ні пробілом, ні порожнім. Однак я отримую однаковий результат для всіх 3 згаданих рядків. Я також намагався використовувати синтаксис "[[", але безуспішно.

Ось мій код:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

Я отримую такий результат:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

Чи відомі порожні рядки як сценарії нуль як сценарії оболонки?
Джосія Йодер,

Відповіді:


123

Вам потрібен простір по обидва боки від !=. Змініть свій код на:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

Велике спасибі, це працює. Але мені цікаво, чому для призначення не використовується пробіл, тоді як для порівняння.
Шубханшу Мішра

5
^^ Це синтаксис. Перше слово в командному рядку - це команда, а наступні - аргументи. var=value [command [args]]- це синтаксис, у якому змінної присвоюється значення. для порівняння [( /usr/bin/[) - це команда, і вона вимагає, щоб var1,! = & var2 мали 3 окремі аргументи. var1! = var2 - це один аргумент.
anishsane

62

Для перевірки порожнього рядка в оболонці

if [ "$str" == "" ];then
   echo NULL
fi

АБО

if [ ! "$str" ];then
   echo NULL
fi

9
Оператором рівності рядка оболонки є =. Це ==не портативний хакер, винайдений авторами оболонки, щоб зіпсувати розум молодих програмістів.
Йенс

17

Якщо вам потрібно перевірити будь-яку кількість пробілів, а не лише один пробіл, ви можете зробити це:

Щоб позбавити рядок зайвого пробілу (також зменшує пробіли посередині до одного пробілу):

trimmed=`echo -- $original`

У --гарантує , що якщо $originalмістить перемикачі зрозуміле луною, вони все одно будуть розглядатися як нормальні аргументи , які будуть виводитися. Крім того , важливо не ставити ""навколо $original, або простору не будуть видалені.

Після цього ви можете просто перевірити, чи $trimmedне пусто.

[ -z "$trimmed" ] && echo "empty!"

3
У оболонці Борна я отримую "-" як значення обрізаного.
Шрідхар Сарнобат

Згідно з цим повідомленням , echo не інтерпретує - означає кінець варіантів. У моїй оболонці Bash я отримую той самий результат, що і Шрідхар Сарнобат
Mr.C

9

Ще одне швидке тестування на рядок, щоб у ньому було щось, крім простору.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" означає рядок ненульової довжини.

Тоді перші дві скісні риски означають збіг із усіма наведеними нижче, у нашому випадку пробілами. Потім за третьою косою рисою слідує рядок, що замінює (порожній), і закривається знаком "}". Зверніть увагу на відмінність від звичайного синтаксису регулярних виразів.

Детальніше про маніпулювання рядками у сценаріях оболонки bash ви можете прочитати тут .


це не [[ -n "$1" ]]те саме, що [[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills ви маєте рацію, якщо використовувати -n зробить це трохи коротшим. Я просто оновив відповідь відповідно.
elomage


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

Видалення всіх рядків та пробілів із рядка призведе до того, що порожній буде зведений до нуля, що може бути перевірено та діяти

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.