bash的使用技巧

这篇文章想整理一下自己看到和用到的一些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工具可以做浮点数运算和更高级的运算,只是使用方法有所不同,如下:

原文链接: https://www.cnblogs.com/myw31415926/archive/2013/03/15/2960647.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/80765

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午7:42
下一篇 2023年2月9日 下午7:43

相关推荐