个人工具
登录
查看“Shell编程基础”的源代码 - Ubuntu中文
页面
讨论
查看源代码
历史
搜索
导航
首页
最近更改
随机页面
页面分类
帮助
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息
查看“Shell编程基础”的源代码
来自Ubuntu中文
←
Shell编程基础
跳转至:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
=== 二进制到十进制的转换 === 脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子: <source lang="bash"> #!/bin/bash # vim: set sw=4 ts=4 et: help() { cat << HELP b2d -- convert binary to decimal USAGE: b2d [-h] binarynum OPTIONS: -h help text EXAMPLE: b2d 111010 will return 58 HELP exit 0 } error() { # print an error and exit echo "$1" exit 1 } lastchar() { # return the last character of a string in $rval if [ -z "$1" ]; then # empty string rval="" return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo -n "$1" | sed 's/ //g' | wc -c ` #sed 's/ //g' 所有空白去掉 sed 's/ /\t/g' 所有空白用t代替 # now cut out the last char 抓取第numofchar个字节 rval=`echo -n "$1" | cut -b $numofchar` } chop() { # remove the last character in string and return it in $rval if [ -z "$1" ]; then # empty string rval="" return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` if [ "$numofchar" = "1" ]; then # only one char in string rval="" return fi numofcharminus1=`expr $numofchar "-" 1` # now cut all but the last char: rval=`echo -n "$1" | cut -b -$numofcharminus1` #原来的 rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`运行时出错. #原因是cut从1开始计数,应该是cut -b 1-${numofcharminus1} } while [ -n "$1" ]; do case $1 in -h) help;shift 1;; # function help is called --) shift;break;; # end of options -*) error "error: no such option $1. -h for help";; *) break;; esac done # The main program sum=0 weight=1 # one arg must be given: [ -z "$1" ] && help binnum="$1" binnumorig="$1" while [ -n "$binnum" ]; do lastchar "$binnum" if [ "$rval" = "1" ]; then sum=`expr "$weight" "+" "$sum"` # $expr 10 + 10 20 expr提示是计算操作 fi # remove the last position in $binnum chop "$binnum" binnum="$rval" weight=`expr "$weight" "*" 2` done echo "binary $binnumorig is decimal $sum" # </source> 该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制: <source lang="bash"> 0 * 1 + 1 * 2 = 2 </source> 为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。 但是还记得前面怎么说的吗?进制转换哪需要这么麻烦: <source lang="bash"> #!/bin/bash while read -p 'input a binary...' num; do if [[ $num == *[!01]* ]]; then echo "含有 0 1 之外的字符" fi echo "$((0x$num))" # 在 num 头上糊一个 0x 然后跑数学计算——就完事了! printf "%d\n" "0x$num" # printf 也可以凑热闹啊 done </source> 如果你喜欢自己算的话,其实也可以从左到右来(反正数学计算不要有事没事玩 expr 啦): <source lang="bash">#!/bin/bash # 人人皆知的 Horner 规则 value=0 echo "写一堆 1 0 完了回车" while read -n 1 char; do case $char in (0|1) ;; # 好 ('') break;; # 没了 (*) echo "你说啥?"; break;; esac ((value *= 2)) ((value += char)) done echo "$value"</source>
返回至
Shell编程基础
。