使用参数构造整数的真实类型



假设有这样的代码:

#! /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,它必须带有$

最新更新