使用参数

时间:2018-04-11 10:23:49

标签: bash

假设这样的代码:

    #! /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))

未能实现我的期望。

是否可以构造一个真实的整数类型?

2 个答案:

答案 0 :(得分:2)

documentation of bash解释了"Shell Parameter Expansion" section

  

参数扩展的基本形式是${parameter} [...]

     

如果parameter的第一个字符是感叹号(!),则会引入一个变量间接层。 Bash使用从parameter的其余部分形成的变量的值作为变量的名称;然后展开此变量,并将该值用于替换的其余部分,而不是parameter本身的值。这称为间接扩展。例外情况是下文所述${!prefix*}${!name[@]}的扩展。感叹号必须紧跟左括号以引入间接。

这导致了一个简单的结论。你的脚本应该是:

#!/bin/bash

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

运行并输出:

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

如果您足够耐心,可以使用{{1}在终端窗口: - p 中阅读任何Unix命令(包括bash)的文档。命令。输入man以阅读man bash的文档(它很长,可能是最长的man页面);上面的摘录已经从中复制过。

答案 1 :(得分:1)

bash中没有整数类型。把一切都想象成一个字符串。 Bash确实有运算符知道如何使用整数字符串进行算术运算。如果我理解正确,你想要的是(test.bash的内容):

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

这样:

test.bash 2

将输出

3

对于变量,$内部$((...))并不真正需要,bash会将非整数字符串解释为变量。特殊情况是脚本参数,例如$1,必须附带$