代码改变世界

bash的使用技巧

2013-03-15 00:25  出来卖菜的  阅读(443)  评论(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工具可以做浮点数运算和更高级的运算,只是使用方法有所不同,如下: