假设这样的代码:
#! /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))
未能实现我的期望。
是否可以构造一个真实的整数类型?
答案 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
,必须附带$
。