前言:学习写shell脚本ing……
本章概要:
多命令分号分开 ,创建shell脚本,美元符引用变量,变量赋值,
反引号或$()捕获命令输出,大于号重定向输出结果,双大鱼号追加数据,
小于号输入重定向,管道符号命令重定向,
expr整数简便运算,$[]内执行基本的数学运行,bc计算器执行浮点运算,退出状态码
目录
多命令使用与创建shell脚本
显示消息与使用变量
重定向输入输出与管道
数学运算与退出脚本
一、多命令使用与创建shell脚本
1.使用多个命令
date;who ###用;隔开即可
2.创建shell脚本
创建文件
编写脚本
-
指定路径
需要告诉shell,你的脚本在哪里,两种方案
3.1 将shell脚本文件所处的目录添加到PATH环境变量中(shell会通过PATH环境变量来查找命令);
3.2 在提示符中用绝对或相对文件路径来引用shell脚本文件。 -
更改权限
代码如下
vim tmp#创建文件并编辑 ### 输入,按i进入编辑模式,可输入内容,按esc后,:wq保存退出 #!/bin/bash date who ##赋予权限 chmod u+x tmp ##执行 ./tmp
二、显示消息与命令替换
1.显示消息
利用echo命令显示消息代码如下
echo This is a test
#This is a test
echo Let's see if this'll work
#Lets see if thisll work
echo "This is a test to see if you're paying attention"
#This is a test to see if you're paying attention
echo 'Rich says "scripting is easy".'
#Rich says "scripting is easy".
注意点:
- echo命令是shell脚本中与用户交互的重要工具
- echo命令通常情况下无需加引号
- 当echo的消息中存在引号时,需要添加另外一种引号,上述代码所示
- 如果想把文本字符串和命令输出显示在同一行中,用echo语句
的-n参数。echo -n "The time and date are: "。需要在字符串的两侧使用引号,保证要显示的字符串尾部有一个空格。
2.使用变量
- 环境变量
shell维护着一组环境变量,用来记录特定的系统信息
可用set命令显示
在脚本中可用$来调用,前面的PATH也是环境变量
-
==反斜线的使用==:只要脚本在引号中出现美元符,它就会以为你在引用一个变量,
要使它成为美元符之意,需在前面加上反斜线\,如
echo "The cost of the item is $15" #The cost of the item is 5 上面语句引用了变量1(未定义),在显示数字5 echo "The cost of the item is \$15" #The cost of the item is $15
-
用户变量
用等号将值赋给用户变量
在变量、等号和值之间不能出现空格
-
引用一个变量值时需要使用美元符,在赋值语句中使用value1变量的值时,仍然必须用美元符。
#变量赋值示意 var1=10 var2=-57 var3=testing var4="still more testing" #!/bin/bash # assigning a variable value to another variable value1=10 value2=$value1 ##变量2引用变量1,仍需加美元符,不然输出为字符value1 echo The resulting value is $value2
3.命令替换
从命令输出中提取信息,并将其赋给变量
-
有两种方法可以将命令输出赋给变量:
反引号字符(`)
$()格式
testing='date' testing=$(date)
-
常见的例子
#!/bin/bash # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d)#+%y%m%d格式告诉date命令将日期显示为两位数的年月日的组合。 ls /usr/bin -al > log.$today
三、重定向输入和输出与管道
1.重定向输入与输出
目的是为了保存输出的结果
-
输出重定向
- 用大于号(>)来完成(如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件)
- 不想覆盖文件原有内容,可以用双大于号(>>)来追加数据。
-
输入重定向
输入重定向符号是小于号(<)
-
内联输入重定向。这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。符号是远小于号(<<)。
==注意==:
必须指定一个文本标记来划分输入数据的开始和结尾。
在命令行上使用内联输入重定向时,shell会用PS2环境变量中定义的次提示符
来提示输入数据
示例
date > test6
date >> test6
wc < test6
wc << EOF
> test string 1
> test string 2
> test string 3
> EOF
#3 9 42 #共三行,9个单词,42个字符
2.管道
将一个命令的输出作为另一个命令的输入,command1 | command2,用(|)符号即可
四、数学运算与退出脚本
1.数学运算
- expr命令
- 特别笨拙
- 所以不用他
- 使用方括号
- 用美元符和方括号($[ operation ])将数学表达式围起来。
- 只支持整数运算
- 浮点解决方案
- 内置计算器bc,通过bc命令即可访问,退出输入quit
- 希望得到小数需要改scale变量
- 在脚本中使用bc
variable=$(echo "options; expression" | bc) - 使用内联重定向,将选项和表达式放在脚本的不同行中可以让处理过程变得更清晰,提高易读性。
variable=$(bc << EOF
options
statements
expressions
EOF
)
- 示例
expr 1 + 5
expr 5 \* 2 ###需使用\来使*为乘法之意,而不是通配符
var1=$[1 + 5]
var2=$[$var1 * 2]##方括号就不要
bc
3.156 * (3 + 5)
25.248
quit
cat test9
#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo The answer is $var1
cat test12
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5
2.退出脚本
目的是为了知道脚本的运行情况
- 查看退出状态码
- 一个专门的变量$?保存上个已执行命令的退出状态码。
- 如需查看运行情况,须立即查看 echo $?
- 成功结束的命令的退出状态码是0。有错误,退出状态是一个正数值
- exit命令
- exit命令允许你在脚本结束时指定一个退出状态码。
- 当查看脚本的退出码时,你会得到作为参数传给exit命令的值或变量值。
- 示例
date
#Sat Jan 15 10:01:30 EDT 2014
echo $?
0