#{}、${}

1.区别
#{}${}
含义#{}是预编译处理,Mybatis在处理#{}时,它会将sql中的#{}替换成占位符,然后调用PreparedStatementset方法来赋值,传入字符串后会自动加上引号 。${}是字符串替换,Mybatis在处理${}时,它会将sql中的${}替换为变量的值(不做字符串处理);使用${}会导致sql注入,不利于系统的安全。
eg#{name} >>> name="大亨"${name}>>>name=大亨
应用场合主要用于获取DAO接口中的参数数据,创建预编译的sql。主要用于获取配置文件数据,创建的不是预编译的sql,而是字符串的拼接。
#{}获取DAO参数数据时,假如参数个数多于一个可有选择的使用@param${}获取DAO参数数据时,必须使用@param注解进行修饰或者使用下标或者参数#{param1}的形式。
注意order by #{id}>>>order by "id"语法错误order by ${id}>>>order by id 正确
2.SQL注入

(1)通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
(2)常见的有匿名登入(在登入框输入恶意的字符串)、借助异常获取数据库信息等。

<think> 我们正在讨论Makefile语法,用户询问`10#$$addhw`的含义。根据之前的引用和Makefile知识,我们需要拆解这个表达式。 首先,注意Makefile中`$`是特殊字符,通常用于变量引用(如`$(VAR)`)或自动化变量(如`$@`)。当需要字面的`$`时,要用`$$`表示(引用[1]和引用[3]提到:`$$`会被make转义成`$`,然后交给shell处理)。 表达式`10#$$addhw`可以分为两部分: 1. `10#`:这在Makefile中通常表示一个特定进制的数字。但是,注意在Makefile中,数字通常不需要指定进制(默认十进制),因此这里可能不是数字。 2. `$$addhw`:根据转义规则,make会将其转换为`$addhw`,然后交给shell解释。 然而,在Makefile中,`#`用于注释,但这里它出现在数字`10`后面,且没有被空格隔开,所以这里可能不是注释。 另一种可能性:这个表达式出现在某个规则或函数中,可能是特定于某个工具或脚本的语法,而不是Makefile本身的语法。 考虑到用户之前的问题(如`$$i`)和引用[1]中的解释,`$$`会被make转义成`$`,然后交给shell。因此,在shell上下文中,`$addhw`会被视为一个shell变量。 那么整个表达式`10#$$addhw`在shell中会变成`10#$addhw`(注意:make处理时,`$$`变成`$`,然后整个字符串传递给shell)。 在shell中,`10#`前缀可以用于表示数字的进制。例如,在bash中,`base#number`表示以`base`进制解释`number`。例如: $((10#123)) # 表示十进制的123 $((16#FF)) # 表示十六进制的FF,即255 所以,`10#$$addhw`在shell中会被解释为:以10进制解释变量`$addhw`的值。 但是,这里`$addhw`是一个变量,它的值应该是一个数字字符串。例如,如果`addhw=123`,那么`10#$addhw`就是十进制的123。 因此,`10#$$addhw`的整体含义是:在shell环境中,将变量`addhw`的值作为一个十进制数来解释(即使它有前导0,也不会被解释为八进制)。 举例: 在Makefile中: test: @addhw=0123; echo $$((10#$$addhw)) 执行make test,输出为123(八进制的0123原本是83,但这里用10#强制十进制,所以0123作为字符串,按十进制得到123?不对,这里需要澄清) 实际上,在bash中,`$((10#$addhw))`的作用是去除变量`$addhw`中可能存在的前导0,因为如果变量以0开头,bash会将其解释为八进制数。例如: addhw=0123 echo $((10#$addhw)) # 输出123(十进制) echo $((addhw)) # 输出83(八进制,因为0123等于83) 所以,`10#$$addhw`通常用于确保将变量作为十进制数处理,避免前导0导致的八进制解释。 总结: - Makefile层面:`$$`被转义为`$`,所以`10#$$addhw`变成`10#$addhw`(字符串)传递给shell。 - Shell层面:`$((10#$addhw))`(注意:通常我们会用$((...))来执行算术运算)是完整的用法,但这里我们看到的是`10#$addhw`,它通常出现在算术运算的上下文中(比如在$(( ))或let中)。所以,如果整个表达式出现在算术运算中,它就会这样解释。 但是,请注意,在用户给出的表达式`10#$$addhw`中,并没有出现$((...)),所以它可能是某个更大的算术表达式的一部分。例如,可能在Makefile的命令部分中,有类似这样的命令: @echo $((10#$$addhw)) 因此,`10#$$addhw`单独出现的情况较少,它通常是shell算术运算的一部分。 结论:`10#$$addhw`在Makefile中经过make转义后变成`10#$addhw`,然后由shell解释为:将变量`addhw`的值以十进制数解释(忽略前导0的八进制含义)。 注意:在Makefile中,我们通常看到的是在规则命令中的使用,例如: addhw = 0123 test: @echo $$((10#$$addhw)) # 输出123 但是,这里有一个错误:在Makefile中,我们定义变量通常使用`addhw = 0123`(Makefile变量),然后在命令中使用时,需要两次转义:一次是make变量,一次是shell变量。但注意,上面的`addhw`是在shell命令中赋值的,所以它是shell变量。如果`addhw`是Makefile变量,则应该这样写: addhw = 0123 test: @echo $$((10#$(addhw))) # 这样写是不对的,因为$(addhw)会被make展开,然后变成$$((10#0123)),再交给shell 实际上,如果我们想使用Makefile变量,并确保它被当作十进制数,我们可以这样: addhw = 0123 test: @echo $$((10#$(addhw))) # 这样在make展开后是:echo $((10#0123)),然后shell执行,输出123 所以,在用户的问题中,`10#$$addhw`中的`addhw`应该是一个shell变量(在命令中定义),而不是Makefile变量。 因此,回答用户的问题: `10#$$addhw`出现在Makefile的命令部分,它会被make转义成`10#$addhw`,然后由shell解释。在shell中,它是算术运算上下文的一部分(通常出现在$((...))中),用于将变量`addhw`的值强制按十进制数解释(避免前导0引起的八进制解释)。 引用说明: - 引用[1]解释了`$$`用于转义为`$`,以在shell中使用变量。 - 引用[3]提到`$`是转义字符。 注意:如果这个表达式出现在非shell上下文中(比如Makefile的函数或条件语句中),那么解释可能不同。但根据常见用法,它很可能出现在规则命令中。 最后,生成相关问题: 1. 如何在Makefile中处理不同进制的数字? 2. Makefile中如何避免前导0导致的八进制解释问题? 3. 在Makefile中,如何将变量传递给shell并作为十进制数使用? </think> 在Makefile中,`10#$$addhw`是一个**数值进制转换表达式**,用于在Shell脚本中将变量值强制解释为十进制数。以下是详细解析: --- ### 结构分解 | 部分 | 作用 | 示例 | |------|------|------| | `10#` | 进制标识符,表示后续数字是10进制 | `10#123` 表示十进制123 | | `$$` | Makefile转义符,生成单个`$`给Shell | `$$` → `$` (实际传递给Shell) | | `addhw` | Shell变量名 | 需在Shell环境中定义 | --- ### 执行流程 1. **Makefile预处理** Makefile将`$$`转义为单个`$`,生成字符串`10#$addhw`传递给Shell ```makefile # Makefile示例 test: @addhw=0123; echo $$((10#$$addhw)) # 输出 123 (而非八进制的83) ``` 2. **Shell解释执行** Shell将`$((10#$addhw))`解释为算术表达式: - `10#` 强制将变量值解释为10进制数 - 消除前导零的八进制歧义(如`0123`本应是八进制,强制为十进制123) --- ### 典型应用场景 1. **消除前导零的进制歧义** ```bash # Shell中直接使用 addhw=0123 echo $((addhw)) # 输出83 (八进制解释) echo $((10#$addhw)) # 输出123 (强制十进制) ``` 2. **Makefile中的硬件地址处理** ```makefile PROGRAM_ADDR := 0x0800 flash: addhw=$(PROGRAM_ADDR); \ openocd -c "flash write_image $${addhw#*x}" # 配合进制转换使用 ``` 3. **跨进制数值比较** ```makefile check: @[ $((10#$(VALUE))) -gt 100 ] && echo "Valid" ``` --- ### 技术原理 1. **Shell的进制表示法** - `base#number` 表示以`base`进制解释`number` - 支持2-36进制(如`2#1010`, `16#FF00`) - 默认无前缀数字为十进制,`0`前缀为八进制,`0x`前缀为十六进制 2. **Makefile与Shell的交互** - `$$` 是Makefile的转义机制(引用[1][3]) - 最终执行的Shell命令实质是 `$((10#$addhw))` - 必须配合Shell算术扩展 `$(( ))` 使用(实际使用时通常包含) --- ### 错误用法示例 ```makefile # 错误1:缺少Shell算术扩展 test1: echo 10#$$addhw # 输出字符串"10#123",非数值 # 错误2:直接用于Makefile变量 VALUE = 0123 test2: echo $((10#$(VALUE))) # 可能报错,因Makefile已展开$(VALUE) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值