1简洁的shell脚本
1.1 Hello
脚本是包含一系列命令的命令行程序。 脚本中包含的命令由解释器执行。 在shell脚本中,shell充当解释器,一条接一条地执行脚本中列出的命令。
任何可以在命令行中执行的命令都可以放入shell脚本中。shell脚本是自动执行任务的好帮手。
让我们来看简单的shell脚本script1.sh:
#!/bin/bash
echo "Scripting is fun!"
在尝试执行脚本之前,请确保它是可执行的
$ chmod +x script-01.sh
$ ./script-01.sh
Scripting is fun!
你会注意到,脚本的第一行以'#!'开头,后面是bash shell程序'/bin/bash'的路径。'#!'可以读成 "sharp bang"。 当脚本的第一行以'#!'可开头时,后面的内容将被用作脚本中所列命令的解释器。
1.2 变量
您可以在 shell 脚本中使用变量。变量就是有名称的存储位置。 你可以把变量看作是名称-值对。要为变量赋值,请使用语法VARIABLE_NAME="Value"。 等号前后不要使用空格。此外,变量是区分大小写的,按照惯例,变量名是大写的。要使用变量,请在变量名前加上美元符号。
$ cat script-05.sh
#!/bin/bash
MY_SHELL="bash"
echo "I like the $MY_SHELL shell."
$ ./script-05.sh
I like the bash shell.
也可以用大括号括住变量名,并在大括号前加上美元符号。 语法 ${variable_name} .
$ cat script-06.sh
#!/bin/bash
MY_SHELL="bash"
echo "I like the ${MY_SHELL} shell."
$ ./script-06.sh
I like the bash shell.
变量前面或后面非空格时通常建议加上大括号,否则会把整个字符串当成变量。
$ ./script-07.sh
I am bashing on my keyboard.
$ cat script-08.sh
#!/bin/bash
MY_SHELL="bash"
echo "I am $MY_SHELLing on my keyboard."
$ ./script-08.sh
I am on my keyboard.
您还可以将命令的输出赋值给变量, 用"$(命令)"即可,"$(命令)"用来替换原来的"hostname
"
$ cat script-09.sh
#!/bin/bash
SERVER_NAME=$(hostname)
echo "You are running this script on ${SERVER_NAME}."
$ ./script-09.sh
You are running this script on andrew-HP.
$ cat script-10.sh
#!/bin/bash
SERVER_NAME=`hostname`
echo "You are running this script on ${SERVER_NAME}."
$ ./script-10.sh
You are running this script on andrew-HP.
1.3 有效的变量名
变量名可以包含字母、数字和下划线。 变量名可以字母或下划线开头,但不能以数字开头。 以下是有效变量名的示例。
# 有效的变量名
FIRST3LETTERS="ABC"
FIRST_THREE_LETTERS="ABC"
firstThreeLetters="ABC"
# 无效变量名
3LETTERS="ABC"
first-three-letters="ABC"
first@Three@Letters="ABC"
1.4 测试
设计脚本的目的是为了取代人在键盘前输入一系列命令的工作。 如果您想自动执行一项任务,但需要根据不同的情况执行不同的操作,该怎么办?由于在需要运行脚本时,人可能不在身边,无法做出决定,因此我们需要对这些情况进行测试,并让脚本采取相应的行动。
要创建测试,请在括号中加入一个条件表达式。 语法如下 "[ 测试条件 ]" 。你可以测试几种情况。 例如,可以比较字符串是否相等、数字是否大于另一个数字或文件是否存在。 下面测试检查/etc/passwd是否存在。如果存在,则返回true。如果文件不存在,则返回false。 即命令以状态1退出。
[ -e /etc/passwd ]
如果使用的是bash shell,可以运行help test命令查看可以执行的各类测试。 也可以阅读test的man页面:man test 。 下面是一些比较常见的测试。
-
文件操作符:
- -d FILE 如果FILE是目录,则为真。
- -e FILE 如果FILE存在,则为真。
- -f FILE 如果FILE存在且是普通文件,则为真。
- -r FILE 如果FILE可读取,则为True。
- -s FILE-如果FILE存在且不是空文件,则为True。
- -w FILE 如果FILE可写入,则为True。
- -x FILE 如果FILE执行可,则为True。
-
字符串操作符
- -z STRING如果字符串为空,则为True。
- -n STRING-如果字符串不为空,则为True。
- STRING 字符串不为空时为True。
- STRING1 = STRING2 如果字符串相等,则为True。
- string1 != string2 如果字符串不相等,则为 rue。
-
算术运算符
- arg1 -eq arg2 如果arg1等于arg2,则为True。
- arg1 -ne arg2 如果arg1不等于arg2,则为True。
- arg1 -lt arg2 如果arg1小于arg2,则为True。
- arg1 -le arg2 True如果arg1小于或等于arg2。
- arg1 -gt arg2 True如果arg1大于arg2。
- arg1 -ge arg2 如果arg1大于或等于arg2,则为True。
1.5 if语句
既然知道了如何判断某个条件是否为真,就可以结合if语句在脚本中做出判断。
if语句以"if"开头,然后是一个测试。下面一行包含then. 接下来是一系列命令,如果测试条件为真,这些命令将被执行。最后,if语句以 fi结尾。 语法如下
if [ condition-true ]
then
command 1
command 2
...
fi
下面是一个例子
$ cat script-11.sh
#!/bin/bash
MY_SHELL="bash"
if [ "$MY_SHELL" = "bash" ]
then
echo "You seem to like the bash shell."
fi
$ ./scr