Linux shell 编程
在项目过程中,对方给了Linux下的操作指令,很是不方便。于是写了Linux的脚本,记录下编写过程中遇到和解决的问题。
-
shell中设置变量的时候,要求等号“=”之间不要有空格
-
变量名$0是脚本名,$n(n>=1)表示传递给脚本的第n个参数
-
使用变量时需要加上$+变量名, 在字符拼接过程中为了确定变量名采用${变量名}
-
${#变量名} 这样就可以取到字符串的长度
-
变量的16进制转换的方式
printf "%x" ${file_size}
-
在项目中需要进行对文件大小按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=1000hex_size=43f1a0hexLow=`printf "%x\n" $((16#$hex_size % 16#$align_size))` hexHigh=`printf "%x\n" $((16#$hex_size / 16#$align_size))`
注意:$(( ))运算后得到的结果是10进制的,所以需要通过printf 转化为16进制。16#表示为16进制
- 如果需要替换文件中的内容,可以用:
sed -i "s/{ {hexBase}}/${hexHigh}/g" test.txt
即将test.txt文本中{ {hexBase}}字符串替换为${hexHigh}的内容