bash的使用技巧
2013-03-15 00:25 出来卖菜的 阅读(446) 评论(0) 编辑 收藏 举报这篇文章想整理一下自己看到和用到的一些bash方面的技巧,当然,这是一个积累的过程,以后我会慢慢更新。也欢迎大家给出意见,或分享自己的一些技巧。
1、取字符串长度
bash中的变量都被当作字符串使用,故取字符串的长度很重要,可使用"#"来获取字符串的长度,如下所示:
var=1234567890 echo ${#var}
输出结果为"10",一定要加大括号"{ }",否则会出错,输出"0val"。
2、查看当前的shell版本
可用如下命名获取当前使用的shell版本:
echo $SHELL echo $0
上面两条命令分别输出"/bin/bash"、"-bash",即为年当前使用的shell版本。
常用的shell版本有:
- /bin/sh:已经被/bin/bash所取代
- /bin/bash:即linux默认的bash
- /bin/ksh:即Komshell,由AT & Bell lab 发展出来,兼容与bash
- bin/tcsh:整合 C Shell,提供了更多的功能
- bin/csh:已经被/bin/tcsh所取代
- /bin/zsh:基于ksh发展出来的,功能更强大的bash
若要在你的linux系统上合法使用这些bash,则必须要将这些shell的版本写入到配置文件"/etc/shells"中。
3、检查用户是否为超级用户
可以通过环境变量UID来检查一个用户是否为超级用户(root),超级用户的UID为0,如下所示:
1 if [ $UID -ne 0 ]; then 2 echo "Not root user. Please run as root" 3 else 4 echo "Root user" 5 fi
4、文件编码的转换
很多朋友可能会遇到这样的问题,从网上拷贝或下载了一个bash脚本到你的Windows机器上,让后再上传到linux服务器上,却发现脚本无法运行,而且会提示一些莫名其妙的错误。其实这及有可能是编码导致的问题。在linux下,一条指令开始执行的判断依据是[Enter],即我们键入回车符指令才开始执行。Linux下的 Enter 为 LF 符号,而Windows下的 Enter 是 CRLF 符号,即多了一个"^M"的符号(可用"cat -A demo.sh"显示出来)。可以通过指令"dos2unix"和"unix2dos"两个指令来转换文件的编码,如下所示:
1 # 将Windows下的断行(Enter)转换为linux下的断行 2 dos2unix oldfile.sh newfile.sh 3 # 将Linux下的断行(Enter)转换为Windows下的断行 4 unix2dos oldfile.sh newfile.sh
另外,你还可能遇见过这样的问题,在Windows下显示正常的文件在linux下会出现中文乱码,这其实是中文编码格式的问题。Windows下的中文编码为gbk,linux下的中文编码为utf8,可以在linux下通过 iconv 命令来转换,如下所示:
iconv -f gbk -t utf8 file.sh
如此,file.sh中的中文即可正确显示了。但原来的file.sh已经被覆盖,若要保留原来的文件,可执行如下命令:
iconv -f gbk -t utf8 file.sh -o newfile.sh
newfile.sh就是没有中文乱码的文件。
5、Bash中的数学操作
在bash中可以用let、(( ))和[ ] 执行基本的算术操作,而在进行高级高作时,expr和bc这两个工具也非常有用。如下:
1 #!/bin/bash 2 3 no1=4 4 no2=5 5 6 ############################################ 7 # let 方法,使用时,变量名前不需要再添加$ 8 # no1和no2相加 9 let result=no1+no2 10 echo $result # 9 11 12 # no1自加和自减的三种方法 13 let no1=no1+1 14 let no1+=1 15 let no1++ 16 echo $no1 # 7 17 18 let no1=no1-1 19 let no1-=1 20 let no1-- 21 echo $no1 # 4 22 23 ############################################ 24 # [ ] 和 (( )) 方法,使用时,变量名可以加$,也可以不加$ 25 result=$[ no1 + no2 ] 26 echo $result # 9 27 result=$[ $no1 + $no2 ] 28 echo $result # 9 29 30 result=$(( no1 + no2 )) 31 echo $result # 9 32 result=$(( $no1 + $no2 )) 33 echo $result # 9 34 35 ############################################ 36 # expr 方法,使用时,变量名必须加$ 37 result=`expr 3 + 4` 38 echo $result # 7 39 result=$(expr $no1 + $no2) 40 echo $result # 9
[ ] 和 (( )) 中的变量与运算符之间可以有空格,也可以没有空格,为个人习惯用空格分割开(受C/C++的毒害太深了)。另外,用expr时,并不是单引号,而是反引号,即有"~"的按键,切记!
以上这些都是整数运算,同过bc工具可以做浮点数运算和更高级的运算,只是使用方法有所不同,如下: