twf_cc 发表于 2005-7-9 17:01:29

BASH 的二三技巧

BASH 的二三技巧

Bash, 通常作为 Linux 默认Shell, 它是人机通讯的界面,另外一个功能是写脚本,
bash 内建数学运算,可以把二进制,八进制和十六进制转换成十进制,不需要呼叫
bc , 2.0X 以上版本都可以,使用 bash 内建命令 declare 就是.

fang@bash ~
$ uname -a   
CYGWIN_NT-5.1 bash 1.5.15(0.127/4/2) 2005-04-18 12:20 i686 unknown unknown Cygwin

fang@bash ~
$ echo $BASH_VERSION
2.05b.0(1)-release

fang@bash ~
$ declare -i x=2#1010

fang@bash ~
$ echo $x
10

fang@bash ~
$ x=8#17

fang@bash ~
$ echo $x
15

fang@bash ~
$ x=16#3e8

fang@bash ~
$ echo $x
1000

fang@bash ~
$
使用 declare -i 初始化变量为数字 ,通过这个表达式, 变量=什么进制#数字,
之後使用 echo 获得变量的值,就是十进制的数字

内建命令 printf 的一个参数可以把十进制转换成十六进制

fang@bash ~
$ printf '%X\n' 1000
3E8

fang@bash ~
$ printf '%X\n' 100
64

fang@bash ~
$ printf '%X\n' 10000
2710

fang@bash ~
$ printf '%X\n' 100001
186A1

fang@bash ~
$ printf '%x\n' 100001
186a1

fang@bash ~
$

'%X' 或 '%x'仅仅是大小写的区别

here document 写脚本时常使用,但是 here string 比较少,事实上还是有用的,例如
读文档

fang@bash ~
$ cat <<<"`< bin/soccer.sh`"
#! /bin/bash
url=http://soccer.goalchina.net/dianziban/
temp=$HOME/url.$$
mydir=$HOME/soccer$(date +%Y%m%d)
trap "rm -rf $temp $mydir ; exit 1" 1 2 3 9
lynx --dump $url | sed '/ShowSoccer\./!d;s/**\. //' | uniq> $temp
k=$(<$temp)
   [ -n "$k" ] || exit 1
   while read n ;do wget -P $mydir -c $n ; done < $temp
       j=0
       for i in $mydir/* ;do
         r=${i##*=}.jpg
         mv $i $mydir/$r
         [ $? -eq 0 ] && let "j += 1"
       done
echo "Total $j paper in $mydir"
rm -f $temp

fang@bash ~

$(< 文档 ) 和 cat 文档是相同的,只是没有呼叫 cat, 运用 bash内建变量方法.

fang@bash ~
$ echo this is testing > junk.txt

fang@bash ~
$ k=$(< junk.txt)

fang@bash ~
$ echo $k
this is testing

fang@bash ~
$

$(< 文档 ) 可以写成 `< 文档 ` ,相同的.

写完了,期望可以抛砖引玉.

kornlee 发表于 2005-7-9 18:26:37

处理浮点数的时候,还需要借助bc/awk等工具 :mrgreen:

BOoRFGOnZ 发表于 2005-7-16 09:47:52

不错
页: [1]
查看完整版本: BASH 的二三技巧