|
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/ *[0-9][0-9]*\. //' | 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 ~
$
$(< 文档 ) 可以写成 `< 文档 ` ,相同的.
写完了,期望可以抛砖引玉. |
|