Linux shell 编程-关于16进制

Linux Shell脚本实战
本文分享了在项目中使用Linux Shell脚本解决实际问题的经验,包括变量设置、16进制转换、文件大小对齐及文本替换技巧。

Linux shell 编程

在项目过程中,对方给了Linux下的操作指令,很是不方便。于是写了Linux的脚本,记录下编写过程中遇到和解决的问题。

  1. shell中设置变量的时候,要求等号“=”之间不要有空格

  2. 变量名$0是脚本名,$n(n>=1)表示传递给脚本的第n个参数

  3. 使用变量时需要加上$+变量名, 在字符拼接过程中为了确定变量名采用${变量名}

  4. ${#变量名} 这样就可以取到字符串的长度

  5. 变量的16进制转换的方式 printf "%x" ${file_size}

  6. 在项目中需要进行对文件大小按16进制进行4k(0x1000)大小的对齐,由于脚本不熟悉,开始16进制运算不太会,于是采取了字符串+16进制组合的方法。首先将16进制数按字符串处理,分为从右向左的取字符串的低三位为低位,去除低三位后的字符串为高位,如果低位不等于000,则高位需要按16进制进行加一,代码如下:

    hex_size=43f1a0
    hexLow=${hex_size:0-3:3} #0-3表示从右向左的第三个字符开始,然后向右取3个字符
    hexHigh=${hex_size:0: ${#hex_size}-3} #从左开始,到 ${#hex_size}长度-3的位置		
    if [ "$hexLow" != "000" ]
    then
    	hexHigh=`printf "%x\n" $((16#$hexHigh+1))`
    fi
    echo "align in base:${hexHigh}000"

后来,发现既然能用 $((16#$hexHigh+1))于是就修改了方案:

align_size=1000
hex_size=43f1a0
hexLow=`printf "%x\n" $((16#$hex_size % 16#$align_size))`  
hexHigh=`printf "%x\n" $((16#$hex_size / 16#$align_size))`
注意:$((  ))运算后得到的结果是10进制的,所以需要通过printf 转化为16进制。16#表示为16进制
  1. 如果需要替换文件中的内容,可以用: sed -i "s/{{hexBase}}/${hexHigh}/g" test.txt 即将test.txt文本中{{hexBase}}字符串替换为${hexHigh}的内容

转载于:https://my.oschina.net/felony/blog/2995678

<think>好的,我现在需要回答用户关于Linux Shell编程中#符号的作用的问题。首先,我得回忆一下自己知道的关于Shell脚本中#符号的用法,然后结合用户提供的引用资料,看看有没有相关的信息可以补充。 首先,我知道在Shell脚本中,#符号通常用来表示注释。注释的作用是解释代码,方便阅读和维护,不会被执行。例如,在脚本的开头可能会用#!/bin/bash来指定解释器,这也是一个特例,虽然以#开头,但后面的!告诉系统用哪个解释器执行脚本。 接下来,用户提供的引用中有没有相关的信息呢?查看引用[2],里面提到了一些Shell命令,比如set args、test、trap、ulimit等,但并没有直接提到#符号的用法。不过引用[3]和[4]主要关于文件结构和代码生成,可能不太相关。不过引用[4]提到在调试时添加日志和错误信息,这可能和注释的使用有关,但可能不是直接的回答点。 另外,用户可能想知道除了注释之外,还有其他用途吗?比如在参数替换中的用法,例如${var#pattern},用来删除变量值开头匹配pattern的部分。或者,在here document中,<<#可以用于忽略缩进,不过这个可能是特定Shell版本的特性,比如Bash 4.0之后的特性。 此外,还有特殊变量$#,表示传递给脚本或函数的参数个数。这也是一个重要的用法,用户可能想知道这一点。 需要确保回答覆盖这些方面:注释、特殊用法如$#、参数替换中的#,以及可能的其他情况。同时,要使用用户指定的格式,行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不需要数学公式,所以可能不用。然后生成相关问题,最后按照引用要求添加引用标识。 需要注意用户提供的引用中是否有相关内容,例如引用[2]中的test、trap等命令,但和#符号的直接关联不大。所以可能不需要添加引用标识,除非有直接关联。但根据用户给的示例,引用的标识可能来自提供的引用列表,但用户的问题是关于Shell中的#,而引用中的内容可能没有直接对应的,所以可能不需要添加引用,或者需要检查是否有相关内容。 例如,引用[2]中的“test expression”可能和条件判断有关,但和#符号无关。而引用[4]提到代码生成中的注释,但用户的问题是关于Shell编程中的#,所以可能可以引用引用[4]中关于代码注释的部分,但需要确认是否合适。例如,引用[4]提到添加必要的注释,这可能与Shell脚本中的注释有关,但用户的问题更基础,所以可能不需要特别引用。 总结下来,回答需要包括以下几点: 1. 单行注释,包括shebang。 2. 特殊变量$#表示参数个数。 3. 参数替换中的${var#pattern}。 4. Here文档中的缩进忽略(如果适用)。 5. 可能其他用途,如进制数表示(如$((16#FF)))等。 然后生成相关问题,如: 1. 如何在Shell脚本中处理命令行参数? 2. Shell脚本中有哪些常用的特殊变量? 3. 如何删除字符串的前缀或后缀? 需要确保回答结构清晰,分点说明,并正确使用格式要求。同时,引用标识需要自然地添加在引用的段落末尾,但根据用户提供的引用内容,可能没有直接相关的引用,所以可能不需要添加。但需要检查是否有间接相关的内容,例如引用[4]中提到的注释部分,可能可以引用到关于代码注释的重要性,但可能用户的问题更基础,所以可能不强制需要引用。</think>### Linux Shell编程中#符号的主要作用 在Linux Shell脚本编程中,#符号主要有以下四类应用场景: #### 1. 注释功能 - 单行注释:从#开始到行尾的内容会被解释器忽略 ```bash # 这是计算用户数的代码 users=$(who | wc -l) # 获取当前登录用户数量 ``` - 特殊注释:`#!/bin/bash` 作为shebang指令必须位于脚本第一行,指定使用bash解释器[^4] #### 2. 特殊变量 - `$#` 表示传递给脚本/函数的参数个数 ```bash echo "参数总数:$#" # 输出形如"参数总数:3" ``` #### 3. 参数扩展 - `${var#pattern}` 删除变量值**开头**匹配pattern的最短部分 ```bash path="/home/user/file.txt" echo ${path#*/} # 输出"home/user/file.txt" echo ${path##*/} # 使用双#号删除最长匹配,输出"file.txt" ``` #### 4. Here Document控制 - 使用`<<-#`可忽略heredoc内容中的前导tab(Bash 4.0+特性) ```bash cat <<- #END 缩进内容会被保留 但前导tab会被删除 #END ``` #### 5. 数值表示(扩展用法) - 表示不同进制数值(需要配合$(( ))使用) ```bash echo $((16#FF)) # 输出255(十六进制转十进制) echo $((2#1100)) # 输出12(二进制转十进制) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值