Создайте истинный тип целого числа с параметром

Допустим, такой код:

    #! /usr/local/bin/bash
    position=1
    echo "Paramter: $1"

Мы видим, что тип 1 в position=1 - это строка,
в то время как тип 1 в "Parameter: $1" - это целое число, которое позиционирует соответствующий аргумент в командной строке.

    $ bash question.sh test
    Paramter: test

При замене 1 в $1 на position это становится расширением параметра.

    position=1
    echo "Paramter: $position"
    # run and output
    $ bash question.sh test
    Parameter: 1

Однако я настаиваю на замене его параметром position.

    position=1
    echo "Parameter: $(($position))"
    #output
    $ bash question.sh test
    Paramter: 1

    position=1
    echo "Parameter: $$(($position))"
    $ bash question.sh test
    Paramter: 34588((1))

Не удалось оправдать мои ожидания.

Можно ли построить истинный тип целого числа?

У вас есть вопрос, как использовать целочисленную арифметику с переменной?

kabanus 11.04.2018 12:25

Я хочу заменить 1 в $1 переменной целочисленного типа. @kabanus

AbstProcDo 11.04.2018 12:27
echo "Parameter: $((position + 1))" ...
l'L'l 11.04.2018 12:29

предупреждение: у вас есть пробел в shebang et double $$ (обычно Pid)

kyodev 11.04.2018 13:03
0
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В bash нет целочисленного типа. Просто думайте обо всем как о струне. В Bash есть операторы, которые умеют выполнять арифметические операции со строками целых чисел. Что вы хотите, если я правильно понимаю, это (содержимое test.bash):

p=1
#Better to space things out in bash!
echo "p: $(( $1 + p ))"

Такой, что:

test.bash 2

выведет

3

Вам действительно не нужен $ внутри $((...)) для переменных, bash интерпретирует нецелочисленную строку как переменную. Особым случаем являются аргументы сценария, такие как $1, который должен поставляться с $.

Параметр позиции 1 в $1 является целым числом, поскольку он считается.

AbstProcDo 11.04.2018 12:34

@Tool Похоже, вы неправильно понимаете, что такое тип в языке программирования. Неважно, какое значение вы ему придаете (например, что-то, что «считается»), у языка есть собственная спецификация. Оператор $(()) принимает строки чисел и выполняет над ними арифметические операции, но это обработка оператора, а не тип .

kabanus 11.04.2018 12:35
$(( $1 + p )) такой же, как $(( p + $1 )), порядок в данном случае не имеет значения.
l'L'l 11.04.2018 12:37

@ l'L'l Правильно, где ты это взял?

kabanus 11.04.2018 12:38

Я понял вашу идею, поэтому 1 в $1 нельзя заменить какой-либо переменной, которую мы установили сами. @kabanus

AbstProcDo 11.04.2018 12:38
Ответ принят как подходящий

документация bash объясняет под Раздел «Расширение параметров оболочки»:

The basic form of parameter expansion is ${parameter} [...]

If the first character of parameter is an exclamation point (!), it introduces a level of variable indirection. Bash uses the value of the variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of parameter itself. This is known as indirect expansion. The exceptions to this are the expansions of ${!prefix*} and ${!name[@]} described below. The exclamation point must immediately follow the left brace in order to introduce indirection.

Отсюда простой вывод. Ваш сценарий должен быть таким:

#!/bin/bash

parameter=1
echo "Parameter #${parameter}: ${!parameter}"

Запускаем и выводим:

$ bash question.sh foo bar
Parameter #1: foo

Если вы достаточно терпеливы, вы можете прочитать документацию по любой команде Unix (включая bash), не выходя из окна терминала :-п, используя команду man. Введите man bash, чтобы прочитать документацию man (это очень длинная, вероятно, самая длинная страница man); приведенный выше отрывок был скопирован с него.

Пожалуйста, помогите, особенно обращайтесь ко всем строкам. @kabanus

AbstProcDo 11.04.2018 12:48

Другие вопросы по теме