查看 shell 和 bash:

  1. # 查看系统的 shell 种类
  2. $ cat /etc/shells
  3. # 查看当前用户的 shell
  4. $ echo $SHELL
  5. $ grep root /etc/passwd
  6. # sh为bash的软链接,大多数情况下,脚本的开头使用“#! /bin/bash”和“#! /bin/sh”是没有区别的
  7. 但更规范的写法是在脚本的开头使用“#! /bin/bash”。
  8. $ ll /bin/sh
  9. # 查看 bash 版本
  10. $ cat /etc/redhat-release
  11. $ bash --version

在 shell 脚本的第一行,指定要使用的 shell:

  1. #!/bin/bash
  2. # 这是注释
  3. # 打印日期
  4. date
  5. who

如果两个命令一起运行,可以把它们放在同一行,之间使用分号隔开:

  1. $ date ; who
  2. # 另一种创建简单脚本的方式
  3. $ cat >test.sh
  4. echo "I'm xiaocan"
  5. ^C
  6. # 直接运行脚本,提示无权限
  7. $ ./test.sh
  8. -bash: ./test.sh: Permission denied
  9. # 使用 sh 可以运行
  10. $ sh test.sh
  11. I'm xiaocan
  12. # 添加执行权限
  13. $ chmod u+x test.sh
  14. $ ./test.sh
  15. I'm xiaocan

如何运行脚本

使用 ./test 的方式执行脚本,需要文件有执行权限,用 chmod u+x 赋予权限。在创建文件时,umask 的值决定了新文件的默认权限设置,在 Ubuntu 中 umask 的值是 022(参加书本第 7 章)

使用 sh test1 的方式执行脚本,不需要文件有执行权限。

使用 source. 运行脚本,它是在当前的 shell 中运行,而不是创建子 shell 运行。

  1. $ cat >test.sh
  2. msg="xiaocan"
  3. ^C
  4. $ echo $msg
  5. $ . test.sh
  6. $ echo $msg
  7. xiaocan

使用 echo 需要注意的点

  • 默认情况下,不需要使用引号,但是字符串里面有单引号或双引号就有问题了
  • 如果用到引号,使用另一个引号包括字符串
  • 可用单引号或双引号
  • 使用 -n 参数可以不换行
  • 单引号中不能使用变量

因此建议,养成使用双引号的习惯。

  1. # 正常情况下不用引号
  2. $ echo This is a test
  3. This is a test
  4. # 字符串含有单引号
  5. $ echo Let's see if this'll work
  6. Lets see if thisll work
  7. # 双引号包括含有单引号的字符串
  8. $ echo "Let's see if this'll work"
  9. Let's see if this'll work
  10. # 单引号包括含有双引号的字符串
  11. $ echo 'He says "shell is easy".'
  12. He says "shell is easy".
  13. # 使用 -n 不换行
  14. $ cat test.sh
  15. echo -n "The time and date are: "
  16. date
  17. msg="This is a test message."
  18. echo "$msg"
  19. echo '$msg'
  20. $ sh test.sh
  21. The time and date are: Fri May 8 21:43:49 CST 2019
  22. This is a test message.
  23. $msg

使用变量

环境变量

shell 维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用 户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索路径。可以用 set 命令来显示一份完整的当前环境变量列表。

  • set 命令查看当前环境变量列表;
  • 在环境变量名称之前加上美元符号( $ )来使用环境变量: ```bash $ echo $PATH /home/xiaocan/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ echo $USER xiaocan

$ echo $HOME /home/xiaocan

  1. <a name="GU23d"></a>
  2. ## 自定义变量
  3. 用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。变量区分大小写。
  4. 使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格。
  5. 引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。
  6. 引用变量有两种方式:`$variable` 或 `${variable}`
  7. 如果 `$` 只是当作正常的美元符号使用,需要转义:
  8. ```bash
  9. # 使用定义 $1 变量,因此只显示 5
  10. $ echo "The cost of the itme is $15"
  11. The cost of the itme is 5
  12. # 转义 $
  13. $ echo "The cost of the itme is \$15"
  14. The cost of the itme is $15

命令替换

有两种方法可以将命令输出赋给变量:

  • 反引号 `
  • $() 格式,最好用这种方式。
  1. #!/bin/bash
  2. testing=`date`
  3. today=$(date +%y%m%d)
  4. # 创建日志文件
  5. touch log.$today

重定向输入和输出

> 输出重定向
>> 追加输出
< 输入重定向
这三个都很简单,不多介绍

  1. $ who > user.txt
  2. $ date >> user.txt
  3. # 使用 wc 统计 user.txt
  4. $ wc < user.txt

内联输入重定向:

使用符号 <<,还必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
shell 会用 PS2 环境变量中定义的次提示符来提示输入数据。

  1. # 查看 PS2 环境变量
  2. $ set | grep PS2
  3. PS2='> '
  4. $ wc << EOF
  5. > hello world
  6. > hello shell
  7. > EOF
  8. 2 4 24

管道

  • 管道两边的命令会同时运行
  • 第一个命令输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。
  1. $ rpm -qa | sort | more

数学运算

三种方式

  • expr 命令,符号两边必须有空格,特殊符号如 * 需要转义。在脚本中使用命令替换获取 expr 命令的输出
  • 使用方括号$[operation],不必注意空格,可以使用任何算数运算,使用 $ 引用变量
  • 使用双括号 $((operation)),不用 $ 就可使用变量,推荐使用。
  1. $ expr 1 + 5
  2. 6
  3. $ expr 2 * 5
  4. expr: syntax error
  5. $ expr 2 \* 5
  6. 10
  7. $ var1=$[ 1 + 5 ]
  8. $ echo $var1
  9. 6
  10. $ var2=$[2*5]
  11. $ echo $var2
  12. 10
  13. $ var3=$[$var1 * ($var1 +$var2)]
  14. $ echo $var3
  15. 96
  16. # 注意使用变量时不用加 $
  17. $ var4=$((var1*var2))
  18. $ echo $var4
  19. 60
  1. $ cat test.sh
  2. #!/bin/bash
  3. var1=10
  4. var2=20
  5. # 使用命令替换获取 expr 的结果
  6. var3=$(expr $var2 / $var1)
  7. echo The result is $var3
  8. $ sh test.sh
  9. The result is 2

bash 计算器

bash shell 只支持整数运算。zsh 支持浮点数运算。

使用内建的 bash 计算器——bc 也可以进行浮点数运算。

使用 bc 命令进入计算器,quit 退出。-q 命令行选项可以不显示欢迎信息。

浮点数运算是由 scale 变量控制的,如果不指定的话,就是 0

bash计算器还能支持变量

  1. $ bc -q
  2. 3.14/5
  3. 0
  4. scale=4
  5. 3.14/5
  6. .6280
  7. var1=10
  8. var2=10*2
  9. print var2
  10. 20
  11. quit
  12. $

在脚本中使用 bc,使用命令替换的方式,格式为:

variable=$(echo "options; expression" | bc)

options 设置变量,可以设置多个,使用分号隔开; express 设置 bc 要执行的数学表达式。

  1. #!/bin/bash
  2. var1=100
  3. var2=45
  4. var3=$(echo "scale=4; $var1 / $var2" | bc)
  5. echo "The answer for this is $var3"

**bc** 和内联重定向结合使用,可以让多个运算过程变得清晰。
需要注意的是,在计算器里面创建的变量,不能在 shell 脚本中使用。

  1. # bc 和内联输入重定向结合使用
  2. var8=$(bc << EOF
  3. scale = 4
  4. a1 = $var4 * $var5
  5. b1 = $var6 * $var7
  6. a1 + b1
  7. EOF
  8. )

退出脚本

退出状态码是一个 0~255的整数值,一个成功结束的命令的退出状态码是 0。如果超过这个范围,最终的结果就是指定的数值除以 256 后得到的余数。

使用 $? 查看上个已执行命令的退出状态码。

使用 exit 命令指定退出状态码。

常用的退出状态码:

状态码 描述
0 命令成功结束
1 一般性未知错误
2 不适合的shell命令
126 命令不可执行
127 没找到命令
128 无效的退出参数
128+x 与 Linux 信号 x 相关的严重错误
130 通过 Ctrl+C 终止的命令
255 正常范围之外的退出状态码