一、Hello World!
让我们先从最简单的编程开始:
# 创建一个Helloword.sh 文件
touch Helloword.sh
# 编辑Helloword.sh 文件
vim Helloword.sh
#!/bin/bash
# This is ower first shell
# by author rivers 2022.10.19
echo "hello world"
ll Helloword.sh
-rw-rw-r-- 1 lx lx 86 10月 19 15:34 helloworld.sh
# 赋予执行权限
chmod o+x Helloword.sh
# 运行helloword.sh 脚本
bash Helloword.sh
hello world
引用shell脚本有两种方法:
1、在PATH环境变量中添加shell脚本的位置
2、使用相对或绝对位置引用shell脚本
二、Shell变量
1、用户变量
shell脚本中的用户变量是我们最常使用的变量。
就像其他编程语言那样,你可以赋值:var_1=10,自定义变量。注意在变量名、等号、值之间,不能有空格。这与其他编程语言稍有不同。
赋值完后,你可以在变量名前加“$”,引用这个变量。如:
#!/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"
至于什么时候要用“$”,什么时候则不需要,你只需要理解并记忆:“引用一个变量值时需要使
用美元符,而引用变量来对其进行赋值时则不要使用美元符。”
2、命令替换
shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋
给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。
有两种方法可以将命令输出赋给变量:
(1)反引号字符(``)
(2)$()格式
我习惯使用第一种方法,值得注意的是反引号并不是单引号,虽然他们长得很像,难以区分,但作用完全不同。反引号键位在键盘数字列的最左边,与波浪号共享同一键。
命令替换允许你将shell命令的输出赋给变量。如:
#!/bin/bash
testing=`date`
echo "The date and time are: " $testing
变量testing获得了date命令的输出,然后使用echo语句显示出它的值.
下面这个例子很常见,它在脚本中通过命令替换获得当前日期并用它来生成唯一文件名:
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
它能生成一个日志文件,且文件的后缀名为当日日期。“%y%m%d”格式告诉date命令将日期显示为两位数的年月日的组合。
3、重定向输入
有些时候你想要保存某个命令的输出而不仅仅只是让它显示在显示器上。bash shell提供了几
个操作符,可以将命令的输出重定向到另一个位置(比如文件)。
最基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:
$ 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
这段代码把日期重定向输入并保存到了test6文件中。
有时,你可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,你可以用双大于号(>>)来追加数据。
4、重定向输出
输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的
输出重定向到文件。输入重定向符号是小于号(<),如:
$ wc < test6
这行代码可以把test6文件输出给wc命令。wc命令意义是“words count”,它可以统计文本的行数、词数和字节数。
因此通过将文本文件重定向到wc命令,你立刻就可以得到文件中的行、词和字节的计数。
5、管道
输入、输出重定向处理两个命令还行,若是处理复数个命令,就显得笨拙了。因此,我们需要用到另一个命令:管道 (|)。这个字符也不太常用,它位于键盘的右方,与反斜杠(\)共享同一键位。
command1 | command2
Linux系统会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。你可以在一条命令中使用任意条管道,接连不断地把输出结果由管道传给其他命令。
6、数学运算
对shell脚本来说,数字运算并不是什么强项,因为很多数学运算符已经被逻辑符占了,使用数学运算符的话,需要不停地在符号前加反斜杠转义,这是件很麻烦的事。
好在shell提供了一种更简单的方法来执行数学表达式:美元符和方括号($[ operation ])将数学表达式围起来。
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4
此外,我还是不推荐使用shell运算,因为bash shell只支持整数运算!如果要计算浮点数的话将会是一件异常麻烦的事。
7、退出脚本
迄今为止所有的示例脚本中,我们都是突然停下来的。运行完最后一条命令时,脚本就结束了。其实还有另外一种更优雅的方法可以为脚本划上一个句号。
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。
Linux提供了一个专门的变量:$?,来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量。它的值会变成由shell所执行的最后一条命令的退出状态码。
$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0
按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态码就是一个正数值。
$ asdfg
-bash: asdfg: command not found
$ echo $?
127
默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出。
你可以改变这种默认行为,返回自己的退出状态码。exit命令允许你在脚本结束时指定一个退出状态码。
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5
$ echo $?
5
exit值可以与if-then语句联用,来检查某个命令返回的错误状态,以便知道命令是否成功。
参考资料:《linux命令行与shell脚本编程大全.第三版》