колотите сценарий с практическими рекомендациями - если никакой ответ или мультилиния не отвечают

Никакой путь, но если Вы используете Make-файл, нет пути:

TARGET=hello
CFLAGS=-Wall -D_BSD_SOURCE hello-world.c
all:
    cc -o $(TARGET) $(CFLAGS) -DCFLAGS="\"$(CFLAGS)\""
1
04.02.2014, 10:44
3 ответа

Вы ищете размер массива панели:

#!/bin/bash

read foo
bar=(${foo})

case ${#bar[@]} in
  0) echo "bar has 0 words" ;;
  1) echo "bar has 1 word" ;;
  *) echo "bar has > 1 words" ;;
esac

В зависимости от входа Вы получаете информацию, сколько содержит панель слов. ${#bar[@]} дает панель числа элементов, содержит.

1
27.01.2020, 23:38
  • 1
    благодарит, это - почти он. таким образом, то, что я должен был сделать, заменить if [ $bar ] с if [ ${#bar[@]} == 1 ].Потрясающе. –  user857990 04.02.2014, 11:30
  • 2
    Остерегайтесь этого если foo '*' например, $bar будет содержать названия всех файлов в текущем каталоге. –  Stéphane Chazelas 04.02.2014, 11:40
  • 3
    И, я думаю, что это не работает на многострочные тексты. Это работает на одну строку со многими словами; действительно ли это - требуемое поведение? –  eppesuig 04.02.2014, 11:44
  • 4
    @StephaneChazelas set -f;read foo;set +f распространенный способ предотвратить globbing? –   04.02.2014, 11:50
  • 5
    @bersch, нет Вам нужно set -f в действительности в bar=($foo), это - когда Вы используете split+glob оператор (оставляющий переменное закрывшее кавычки расширение) и только хотите часть разделения. read не делает globbing. –  Stéphane Chazelas 04.02.2014, 11:52

С любой подобной Границе оболочкой:

case $bar in
  "" | *[!$IFS]*[$IFS]*[!$IFS]*) echo empty or multi-word;;
  *) echo OK
esac

Или:

set -f
set -- $bar
if [ "$#" -eq 1 ]; then
   echo OK
else
   echo empty of multi-word, words being:
   printf '  "%s"\n' "$@"
fi

Установите IFS на разделителя слов. Например, если слова предназначены, чтобы быть непустыми строками:

IFS='
'
1
27.01.2020, 23:38

У Вас может просто быть небольшая функция та проверка на это. Это - пример с несколькими тестами:

empty_or_multiline()
{
  [ -z "$1" ] && return 0
  count=$(echo "$1" | wc -l)
  [ $count -gt 1 ] && return 0

  return 1
}

# test number 1
bar=
if empty_or_multiline "$bar"
then
  echo Empty or multiline
else
  echo bar="$bar"
fi

# test number 2
bar=jajhsflgkh
if empty_or_multiline "$bar"
then
  echo Empty or multiline
else
  echo bar="$bar"
fi

# test number 3
bar="kjh\nskjfjhgf"
if empty_or_multiline "$bar"
then
  echo Empty or multiline
else
  echo bar="$bar"
fi
0
27.01.2020, 23:38
  • 1
    Обратите внимание, что результат теста 3 будет зависеть от реализации echo и для bash на среде и/или как bash был скомпилирован. Посмотрите, Почему printf лучше, чем эхо для деталей. –  Stéphane Chazelas 04.02.2014, 12:22

Теги

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