SHELL学习笔记一

使用变量

环境变量

$ cat test2
#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME 
$ echo "The cost of the item is $15"
The cost of the item is 5
反斜线允许shell脚本将美元符解读为实际的美元符,而不是变量
$ echo "The cost of the item is \$15"
The cost of the item is $15 

用户变量

$ cat test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"
$
运行脚本会有如下输出。
$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$ 

命令替换

有两种方法可以将命令输出赋给变量:
反引号字符( ` )
$() 格式

testing='date'
或
testing=$(date) 
通过命令替换获得当前日期并用它来生成唯一文件名。
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today

$ date +%y%m%d
140131
$ 

警告  命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。
 在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!

重定向输入和输出

 输出重定向

command > outputfile

$ date > test6
$ ls -l test6
-rw-r--r--    1 user     user           29 Feb 10 17:56 test6
$ cat test6
Thu Feb 10 17:56:58 EDT 2014
$ 

command < inputfile

wc 命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:

  •  文本的行数
  •  文本的词数
  •  文本的字节数
$ wc < test6
      2      11      60
$ 

管道

command1 | command2

执行数学运算

expr 命令

  • ARG1 | ARG2  如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2  
  • ARG1 & ARG2  如果没有参数是null或零值,返回ARG1;否则返回0  
  • ARG1 < ARG2  如果ARG1小于ARG2,返回1;否则返回0  
  • ARG1 <= ARG2  如果ARG1小于或等于ARG2,返回1;否则返回0  
  • ARG1 = ARG2  如果ARG1等于ARG2,返回1;否则返回0  
  • ARG1 != ARG2  如果ARG1不等于ARG2,返回1;否则返回0  
  • ARG1 >= ARG2  如果ARG1大于或等于ARG2,返回1;否则返回0  
  • ARG1 > ARG2  如果ARG1大于ARG2,返回1;否则返回0  
  • ARG1 + ARG2  返回ARG1和ARG2的算术运算和
  • ARG1 - ARG2  返回ARG1和ARG2的算术运算差
  • ARG1 * ARG2  返回ARG1和ARG2的算术乘积
  • ARG1 / ARG2  返回ARG1被ARG2除的算术商
  • ARG1 % ARG2  返回ARG1被ARG2除的算术余数
  • STRING : REGEXP  如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
  • match STRING REGEXP  如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
  • substr STRING POS LENGTH  返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串
  • index STRING CHARS  返回在STRING中找到CHARS字符串的位置;否则,返回0  
  • length STRING  返回字符串STRING的数值长度
  • + TOKEN  将TOKEN解释成字符串,即使是个关键字
  • (EXPRESSION)  返回EXPRESSION的值
$ cat test6
#!/bin/bash
# An example of using the expr command
var1=10
var2=20
var3=$(expr $var2 / $var1)
echo The result is $var3
要将一个数学算式的结果赋给一个变量,需要使用命令替换来获取 expr 命令的输出:
$ chmod u+x test6
$ ./test6
The result is 2
$ 

 使用方括号

$ cat test7
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4
$
运行这个脚本会得到如下输出。
$ chmod u+x test7
$ ./test7
The final result is 500
$ 

浮点解决方案

bc的基本用法

bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该
表达式,最后返回结果。bash计算器能够识别:

  •  数字(整数和浮点数)
  •  变量(简单变量和数组)
  • 注释(以#或C语言中的 /* */ 开始的行)
  • 表达式
  • 编程语句(例如 if-then 语句)
  • 函数

浮点运算是由内建变量 scale 控制的。scale 变量的默认值是 0 。

$ bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit
$ 

 在脚本中使用bc

$ cat test10
#!/bin/bash
var1=100
var2=45
var3=$(echo "scale=4; $var1 / $var2" | bc)
echo The answer for this is $var3
$
#脚本定义了两个变量,它们都可以用在 expression 部分,然后发送给 bc 命令。别忘了用美元符表示的是变量的值而不是变量自身。这个脚本的输出如下。
$ ./test10
The answer for this is 2.2222
$ 

退出脚本

shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。

查看退出状态码

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

exit 命令

退出状态码被缩减到了0~255的区间。shell通过模运算得到这个结果。一个值的模就是被除后的余数。最终的结果是指定的数值除以256后得到的余数。在这个例子中,指定的值是 300 (返回值),余数是44,因此这个余数就成了最后的状态退出码。

$ cat test14b
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 * $var2]
echo The value is $var3
exit $var3
$

$ ./test14b
The value is 300
$ echo $?
44
$  
01-04 21:50
查看更多