работа с файлами в оболочке ubuntu [дубликат]

Очень просто решить эту проблему. Просто нажмите на виджет (например, кнопку или текстовое поле и т. Д.), Затем нажмите кнопку «Infer constraints». Вы можете видеть на прикрепленном изображении или этой ссылке Youtube: https://www.youtube.com/watch?v=uOur51u5Nk0

Infer constraints picture [/g1]

15
задан Michael Petrotta 7 April 2013 в 22:08
поделиться

4 ответа

Это должно быть:

 if [ $x -eq 3 ]; then .....

пояснение:

Для сравнения целых чисел вы должны использовать эти операторы (скопированные из man test):

   INTEGER1 -eq INTEGER2
          INTEGER1 is equal to INTEGER2

   INTEGER1 -ge INTEGER2
          INTEGER1 is greater than or equal to INTEGER2

   INTEGER1 -gt INTEGER2
          INTEGER1 is greater than INTEGER2

   INTEGER1 -le INTEGER2
          INTEGER1 is less than or equal to INTEGER2

   INTEGER1 -lt INTEGER2
          INTEGER1 is less than INTEGER2

   INTEGER1 -ne INTEGER2
          INTEGER1 is not equal to INTEGER2

operator == и! = предназначены только для сравнения строк.

для информации: "[" команда является псевдонимом для команды "test".

28
ответ дан loentar 28 August 2018 в 22:53
поделиться

Сценарий оболочки не был действительно предназначен для полного языка, и он сильно зависит от работы других внешних команд.

Переменные используют sigil , который является тем, что $ перед ними.

Например:

foo=foo_value
echo foo foo $foo foo

Будет печатать:

foo foo foo_value foo

Обратите внимание, что кавычки не нужны для оператора echo для строк. Пакетная оболочка Windows очень похожа:

set foo = foo_value
echo foo foo %foo% foo

Как вы можете видеть, sigil используется, когда переменная предполагается расширять, но не тогда, когда вы ее определяете. Это потому, что оболочки Unix - это интеллектуальные оболочки. Они запускают командную строку, прежде чем она будет выполнена. Оболочка заменит переменные среды перед исполнением :

foo=bar
$foo="whose value is this"  #Note the dollar sign!
echo The value of foo is $foo
echo The value of bar is $bar

Это выведет:

The value of foo is foo
The value of bar is whose value is this

Если вы используете команду set -xv , вы увидите, что $foo="whose value is this" раскрывается до bar=whose value is this" до его выполнения.

В оболочках стиля Bourne, таких как Kornshell и BASH, утверждение if не так, как вы думаете. Команда if выполняет оператор и выберет предложение if , если эта команда возвращает нулевое значение. Например:

cat "foo" > my_file       #Create a one line file with the string foo in it.
if grep -q "foo" my_file  #grep command will return a zero exit code if it finds foo
then
    echo "The string 'foo' is in file my_file"
fi

Обратите внимание, что предложение if не является логическим выражением. Это фактическая команда, которая выполняется.

Где-то в начале разработки Unix была создана команда test. Вы можете выполнить man test и посмотреть, как его использовать.

Команда test позволяет вам сделать это:

foo=3
bar=3
if test foo -eq bar
then
    echo "foo and bar are equal"
else
    echo "foo and bar are not equal"
fi

Если вы сделайте следующее:

$ ls -li /bin/test /bin/[

Вы увидите, что команда, называемая [, действительно существует и является жесткой ссылкой на команду test. Это было создано, чтобы сделать оператор if более похожим на оператор if, который вы увидите на обычных языках программирования:

foo=3
bar=3
if [ foo -eq bar ]
then
    echo "foo and bar are equal"
else
    echo "foo and bar are not equal"
fi

Точно такой же скрипт, как указано выше, но с [ вместо test.

Это объясняет, почему во многих тестах вам нужна метка (это параметр команды test, а параметры начинаются с тире!). Это также объясняет, почему вам нужны пробелы вокруг [ и ]. Это фактические команды Unix, а команды Unix должны иметь пробелы вокруг них, поэтому оболочка может их обрабатывать.

Еще одна проблема заключается в том, почему оболочка имеет два разных набора тестов для строк и чисел. Это потому, что строки могут содержать только цифры, но не являются числовыми. Например, если вы делаете инвентарь, у вас может быть номер детали 001 и 01. Численно они равны, но, как строки, это две разные строки. Сценарий оболочки не знает. Вместо этого вы должны сообщить сценарию оболочки, если это числовое сравнение или сравнение строк.

Perl имеет похожие проблемы, поскольку вы не объявляете переменные числовыми или нечисловыми:

                         Shell Script              Perl
Boolean Operator     Numeric     String     Numeric    String
===================  =======     ======     =======    ======
Equals                 -eq        =           ==         eq
Not Equals             -ne        !=          !=         ne
Greater Than           -gt        >           >          gt
Less Than              -lt        <           <          lt
Greater or Equals      -ge        >=          >=         ge
Less Than or Equals    -le        <=          <=         le

Вы можете попробовать несколько других вещей:

$ echo "*"    #Echos the asterisk
$ echo *      #No quotes: Prints all files in current directory

Обратите внимание, что оболочка расширяет * перед выполнением команды echo , Это основное различие между сценарием оболочки и типичным языком программирования. Сначала оболочка расширяет (заполняет переменные среды, подменю glob, запускает подкоманды), прежде чем она действительно выполнит команду.

set -xv покажет вам, какая команда выполняется, и как оболочка расширяет перед выполнением команды. Выполнение set +xv отключит это. Играйте с этим, и вы скоро поймете оболочку немного лучше.

1
ответ дан David W. 28 August 2018 в 22:53
поделиться
  • пробелы являются обязательными в выражении [ ], поэтому if [ $x == 3 ]; then
  • вам понадобится sigill для переменных в тестах [ ]
0
ответ дан Gilles Quenot 28 August 2018 в 22:53
поделиться

Для первого сообщения об ошибке удалите знак доллара $ и не допускается пробел вокруг знака равенства =

x=3

. Для второго сообщения об ошибке вставьте пробел и доллар знак $ перед x и пробел после 3

if [ $x -eq 3 ]

. Как правильно указала @lentar, она должна быть -eq и ни =, ни ==.

3
ответ дан Olaf Dietsche 28 August 2018 в 22:53
поделиться
Другие вопросы по тегам:

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