假设有这样的代码:
#! /usr/local/bin/bash
position=1
echo "Paramter: $1"
我们可以看到position=1
中的1
类型是一个字符串,
而"Parameter: $1"
中的1
类型是一个整数,它将适当的参数放置在命令行上。
$ bash question.sh test
Paramter: test
当将 1 in$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))
未能达到我的期望。
是否可以构造真实类型的整数?
bash
的文档在"Shell 参数扩展"部分进行了解释:
参数展开的基本形式是
${parameter}
[...]如果
parameter
的第一个字符是感叹号(!
),则引入了可变间接级别。Bash 使用由其余部分形成的变量的值作为变量的名称parameter
;然后扩展此变量,并在替换的其余部分中使用该值,而不是parameter
本身的值。这称为间接扩展。例外情况是下面描述的${!prefix*}
和${!name[@]}
的扩展。感叹号必须紧跟在左大括号后面,以便引入间接寻址。
这导致了一个简单的结论。您的脚本应如下所示:
#!/bin/bash
parameter=1
echo "Parameter #${parameter}: ${!parameter}"
运行和输出:
$ bash question.sh foo bar
Parameter #1: foo
如果你有足够的耐心,你可以使用man
命令在舒适的终端窗口:-p中阅读任何Unix命令(bash
包括)的文档。键入man bash
以阅读man
的文档(它很长,可能是最长的man
页);上面的摘录是从中复制的。
bash 中没有整数类型这样的东西。只要把所有东西都想象成一个字符串。Bash 确实有知道如何用整数字符串进行算术运算的运算符。如果我理解正确,你想要的是(test.bash
的内容):
p=1
#Better to space things out in bash!
echo "p: $(( $1 + p ))"
这样:
test.bash 2
将输出
3
您实际上不需要变量$((...))
内部的$
,bash
会将非整数字符串解释为变量。特殊情况是脚本参数,例如$1
,它必须带有$
。