Linux bash if пустая строка

How to find whether or not a variable is empty in Bash

The true/false table in Test for non-zero length string in Bash: -n “$var” vs “$var”. post that @codeforester points to is absolutely fabulous in showing how you use -n and -z (their context) really matters, and that with the shell scripting languages their are any number of (seemingly subtle) gotchas to be aware of.

10 Answers 10

In Bash at least the following command tests if $var is empty:

if [[ -z "$var" ]]; then # $var is empty, do what you want fi 

The command man test is your friend.

double square brackets are useless here. it may be simple [ -z «$var» ] or even easier imho if test -z «var» .. anyway +1 🙂

double square brackets are not useless, if I do not inlcude I ma getting ./test.ksh[8]: test: argument expected dunnot the reason but single bracket didn’t work but the double one had it.

Just an added comment for a specific situation not directly mentioned in the question: if the variable is unset and the set -u option has been activated, this test will fail with unbound variable . In this case, you might prefer @alexli’s solution.

@LucaBorrione Just as a late side note: «[[» can be seen as «never useless»; as using «[[» has some advantages over «[» (see stackoverflow.com/questions/669452/… for example)

var="" if [ -n "$var" ]; then echo "not empty" else echo "empty" fi 

@glenn jackman: good comment; it’s true that -z is closer to what was asked. Jay has put this in his answer so I’ll refrain from updating mine and leave this up as is.

Note that -z means Zero-length string, and -n means Non-zero-length string. Reference: gnu.org/software/bash/manual/html_node/…

which is obviously very robust and shell independent.

@guettli: If $variable is empty, then the string to the left of the comparison operator becomes only x , which is then equal to the string to the right of the operator. [ x = x ] is «true», so in practice this tests whether $variable is empty or not. As an addition (3½ years after the fact 🙂 ) I would never use this myself since -z does what I probably want in a clearer way, but I wanted to add this answer since this method is frequently seen «in the wild»; perhaps written this way on purpose by people who have had different experiences than I have.

«Since this method is frequently seen «in the wild»;» This is commonly seen in configure scripts, and it works with sh and any non-standard bash which might not have the -z flag. This situation was commonly the case when there were many flavors of Unix which were all mildly incompatible with each other in minor details, such as support for a -z flag. Now that Linux has taken over, it is not much of an issue (unless you are on an old, funny Unix)

Читайте также:  How to delete folder in linux terminal

prints yes if the variable is set. $ will return 1 when the variable is set, otherwise it will return empty string.

While not mentioned in the question, an important advantage of this answer is that it works even when the variable is undefined and the set -u option ( nounset ) is activated. Almost all other answers to this question will fail with unbound variable in this case.

This :+ notation is also useful for situations where you have optional command line parameters that you have specified with optional variables. myprogram $ $

This is a quick way to check the validity of an entry of a variable and exit if not set: [ «$variable» ] || exit

The question asks how to check if a variable is an empty string and the best answers are already given for that.

But I landed here after a period passed programming in PHP, and I was actually searching for a check like the empty function in PHP working in a Bash shell.

After reading the answers I realized I was not thinking properly in Bash, but anyhow in that moment a function like empty in PHP would have been soooo handy in my Bash code.

As I think this can happen to others, I decided to convert the PHP empty function in Bash.

a variable is considered empty if it doesn’t exist or if its value is one of the following:

  • «» (an empty string)
  • 0 (0 as an integer)
  • 0.0 (0 as a float)
  • «0» (0 as a string)
  • an empty array
  • a variable declared, but without a value

Of course the null and false cases cannot be converted in bash, so they are omitted.

function empty < local var="$1" # Return true if: # 1. var is a null string ("" as empty string) # 2. a non set variable is passed # 3. a declared variable or array but without a value is passed # 4. an empty array is passed if test -z "$var" then [[ $( echo "1" ) ]] return # Return true if var is zero (0 as an integer or "0" as a string) elif [ "$var" == 0 2>/dev/null ] then [[ $( echo "1" ) ]] return # Return true if var is 0.0 (0 as a float) elif [ "$var" == 0.0 2> /dev/null ] then [[ $( echo "1" ) ]] return fi [[ $( echo "" ) ]] > 
if empty "$" then echo "empty" else echo "not empty" fi 

Demo:
The following snippet:

#!/bin/bash vars=( "" 0 0.0 "0" 1 "string" " " ) for (( i=0; i; i++ )) do var="$" if empty "$" then what="empty" else what="not empty" fi echo "VAR \"$var\" is $what" done exit 
VAR "" is empty VAR "0" is empty VAR "0.0" is empty VAR "0" is empty VAR "1" is not empty VAR "string" is not empty VAR " " is not empty 

Having said that in a Bash logic the checks on zero in this function can cause side problems imho, anyone using this function should evaluate this risk and maybe decide to cut those checks off leaving only the first one.

Источник

Linux bash if пустая строка

if [ «$a» -eq «$b» ]

Читайте также:  Как полностью обновить kali linux

if [ «$a» -ne «$b» ]

if [ «$a» -gt «$b» ]

if [ «$a» -ge «$b» ]

if [ «$a» -lt «$b» ]

if [ «$a» -le «$b» ]

меньше или равно (внутри двойных круглых скобок)

больше (внутри двойных круглых скобок)

больше или равно (внутри двойных круглых скобок)

[[ $a == z* ]] # истина, если $a начинается с символа "z" (сравнение по шаблону) [[ $a == "z*" ]] # истина, если $a равна z* [ $a == z* ] # имеют место подстановка имен файлов и разбиение на слова [ "$a" == "z*" ] # истина, если $a равна z* # Спасибо S.C.

меньше, в смысле величины ASCII-кодов

больше, в смысле величины ASCII-кодов

Обратите внимание! Символ «>» необходимо экранировать внутри [ ].

См. Пример 25-6 относительно применения этого оператора сравнения.

строка «пустая» , т.е. имеет нулевую длину

Пример 7-5. Операции сравнения

#!/bin/bash a=4 b=5 # Здесь переменные "a" и "b" могут быть как целыми числами, так и строками. # Здесь наблюдается некоторое размывание границ #+ между целочисленными и строковыми переменными, #+ поскольку переменные в Bash не имеют типов. # Bash выполняет целочисленные операции над теми переменными, #+ которые содержат только цифры # Будьте внимательны! echo if [ "$a" -ne "$b" ] then echo "$a не равно $b" echo "(целочисленное сравнение)" fi echo if [ "$a" != "$b" ] then echo "$a не равно $b." echo "(сравнение строк)" # "4" != "5" # ASCII 52 != ASCII 53 fi # Оба варианта, "-ne" и "!=", работают правильно. echo exit 0

Пример 7-6. Проверка — является ли строка пустой

#!/bin/bash # str-test.sh: Проверка пустых строк и строк, не заключенных в кавычки, # Используется конструкция if [ . ] # Если строка не инициализирована, то она не имеет никакого определенного значения. # Такое состояние называется "null" (пустая) (это не то же самое, что ноль). if [ -n $string1 ] # $string1 не была объявлена или инициализирована. then echo "Строка \"string1\" не пустая." else echo "Строка \"string1\" пустая." fi # Неверный результат. # Выводится сообщение о том, что $string1 не пустая, #+не смотря на то, что она не была инициализирована. echo # Попробуем еще раз. if [ -n "$string1" ] # На этот раз, переменная $string1 заключена в кавычки. then echo "Строка \"string1\" не пустая." else echo "Строка \"string1\" пустая." fi # Внутри квадратных скобок заключайте строки в кавычки! echo if [ $string1 ] # Опустим оператор -n. then echo "Строка \"string1\" не пустая." else echo "Строка \"string1\" пустая." fi # Все работает прекрасно. # Квадратные скобки -- [ ], без посторонней помощи определяют, что строка пустая. # Тем не менее, хорошим тоном считается заключать строки в кавычки ("$string1"). # # Как указывает Stephane Chazelas, # if [ $string 1 ] один аргумент "]" # if [ "$string 1" ] два аргумента, пустая "$string1" и "]" echo string1=initialized if [ $string1 ] # Опять, попробуем строку без ничего. then echo "Строка \"string1\" не пустая." else echo "Строка \"string1\" пустая." fi # И снова получим верный результат. # И опять-таки, лучше поместить строку в кавычки ("$string1"), поскольку. string1="a = b" if [ $string1 ] # И снова, попробуем строку без ничего.. then echo "Строка \"string1\" не пустая." else echo "Строка \"string1\" пустая." fi # Строка без кавычек дает неверный результат! exit 0 # Спвсибо Florian Wisser, за предупреждение.

Пример 7-7. zmost

#!/bin/bash #Просмотр gz-файлов с помощью утилиты 'most' NOARGS=65 NOTFOUND=66 NOTGZIP=67 if [ $# -eq 0 ] # то же, что и: if [ -z "$1" ] # $1 должен существовать, но может быть пустым: zmost "" arg2 arg3 then echo "Порядок использования: `basename $0` filename" >&2 # Сообщение об ошибке на stderr. exit $NOARGS # Код возврата 65 (код ошибки). fi filename=$1 if [ ! -f "$filename" ] # Кавычки необходимы на тот случай, если имя файла содержит пробелы. then echo "Файл $filename не найден!" >&2 # Сообщение об ошибке на stderr. exit $NOTFOUND fi if [ $ != "gz" ] # Квадратные скобки нужны для выполнения подстановки значения переменной then echo "Файл $1 не является gz-файлом!" exit $NOTGZIP fi zcat $1 | most # Используется утилита 'most' (очень похожа на 'less'). # Последние версии 'most' могут просматривать сжатые файлы. # Можно вставить 'more' или 'less', если пожелаете. exit $? # Сценарий возвращает код возврата, полученный по конвейеру. # На самом деле команда "exit $?" не является обязательной, # так как работа скрипта завершится здесь в любом случае,

построение сложных условий проверки

Читайте также:  Linux nvidia нет разрешения

exp1 -a exp2 возвращает true, если оба выражения, и exp1, и exp2 истинны.

exp1 -o exp2 возвращает true, если хотябы одно из выражений, exp1 или exp2 истинно.

Примечания

Как указывает S.C., даже заключение строки в кавычки, при построении сложных условий проверки, может оказаться недостаточным. [ -n «$string» -o «$a» = «$b» ] в некоторых версиях Bash такая проверка может вызвать сообщение об ошибке, если строка $string пустая. Безопаснее, в смысле отказоустойчивости, было бы добавить какой-либо символ к, возможно пустой, строке: [ «x$string» != x -o «x$a» = «x$b» ] (символ «x» не учитывается).

Источник

Check if string is neither empty nor space in shell script

I am trying to run the following shell script which is supposed to check if a string is neither space nor empty. However, I am getting the same output for all the 3 mentioned strings. I have tried using the «[[» syntax as well but to no avail. Here is my code:

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 

6 Answers 6

You need a space on either side of the != . Change your code to:

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 

Thanks a lot, it works. But I wonder why the assignment doesn’t use a space whereas a comparison does.

^^It’s syntax. The first word on the command line is the command & subsequent ones are arguments. var=value [command [args]] is the syntax, in which a variable is assigned value. for comparison, [ ( /usr/bin/[ ) is the command & it requires var1, != & var2 to be 3 separate arguments. var1!=var2 is a single argument.

Источник

Оцените статью
Adblock
detector