SHELL学习笔记一

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 
$  

 

上一篇:Parameter '0' not found


下一篇:计算金额文档