shell脚本基础应用
一、脚本执行
-
编写一个最简单的脚本并保存在/opt/learn/helloworld.sh下
#!/usr/bin/bash #这是一个最简单的shell脚本(注释) echo "Hello" -
使用如下命令运行helloworld.sh
. helloworld.sh sh helloworld.sh bash helloeorld.sh source helloworld.sh chmod u+x helloworld.sh ./helloworld.sh
二、传递参数给shell脚本
| 命令 | 作用 |
|---|---|
| echo "Hello,$1 $2 $3" | 程序体输出Hello后面带三个参数的值 |
| sh hello.sh Denny Bill Mary | 运行时会输出Hello,Denny,Dill,Mary |
| $1 | 代表第一个参数 |
| $2 | 代表第二个参数 |
| …… | 以此类推,但不能超过9个参数 |
| $0 | 特殊的,$0表示该shell脚本的名称 |
三、引号的特殊用法
| 命令 | 作用 |
|---|---|
| echo "$1" | 输出第一个参数的值 |
| echo '$1' | 输出$1 |
| echo 'date' | 输出date |
echo \date |
输出当前时间(这里使用的是~下面的反引号而不是单引号) |
now=\date "+%Y-%m-$d %H:%M:%S" |
格式化输出时间,同时赋值 |
四、特殊用法
1. 特殊变量
| 命令 | 作用 |
|---|---|
| $# | 传递到脚本的参数个数 |
| $0 | 脚本的名称 |
| $* | 以一个单字符串的形式显示所有向脚本传递的参数,与位置变量不同,此项参数可以超过9个 |
| $$ | 脚本运行的当前进程ID号 |
| $! | 后台运行的最后一个进程的进程ID号 |
| $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
| $? | 显示最后命令的退出状态,0表示正确,其他任何值表示错误 特别的:在脚本中可自定义0~255的退出状态码 |
| $_ | 代表上一个命令的最后一个参数,如果上一个命令是echo,则这个参数就是echo显示的内容 |
-
理解*与@的区别
function testargs { echo "There is $# args" echo $10 } testargs "$*" testargs "$@" # $*的结果是所有参数构成一个字符串:"11 22 33 44" # $@的结果是每一个参数单独加上引号:"11" "22" "33" "44"
2. expr表达式
| 命令 | 作用 |
|---|---|
| expr 10 + 10 | expr是一个手工计算器,此处会输出20(注意空格) |
| expr 10+10 | 此处会输出10+10 |
| expr 10.1 + 1 | expr不能处理小数 |
| expr "hello"="hello" | 成功返回1,失败返回0 |
| 练习: | 使用echo命令输出一句话:300/5*6=360,其中360由运算得到:echo "300/5*6=\expr 300 \/ 5 \* 6" (要加转义符) |
五、test命令
1. test文件
| 命令 | 作用 |
|---|---|
| test -e /etc/passwd | 测试文件/etc/passwd是否存在,存在则$?返回0,否则返回1 |
| [ -e /etcc/passwd ] | 与test -e /etc/passwd作用一样,注意空格 |
| -d file | 如果文件为一个目录,则为真 |
| -e file | 如果文件存在,则为真 |
| -f file | 如果文件为一个普通文件,则为真 |
| -r file | 如果文件可读则为真 |
| -w file | 如果文件可写,则为真 |
| -x file | 如果文件可执行,则为真 |
| -s file | 如果文件长度不为0,则为真 |
| -L file | 如果文件为符号文件,则为真 |
2. 逻辑处理
| 命令 | 作用 |
|---|---|
| -e /etc/passwd -a -r /etc/passwd | 逻辑与,操作符两边均为真,结果为真,否则为假 |
| -e /etcc/passwd -o -r /etc/passwd | 逻辑或,操作符两边一边为真,结果为真,否则为假 |
| ! -e /etc/passwd | 逻辑否,条件为假,结果为真 |
3. test字符串
| 命令 | 作用 |
|---|---|
| $USER = "root" | 字符串比较 |
| "$USER" = "root" | 建议使用此种方式 |
| = | 等于 |
| != | 不等于 |
| -z | 为空字符串 |
| -n | 非空字符串 |
4. test数值
| 命令 | 作用 |
|---|---|
| [ $$ -eq 18646 ] | 对数值的测试 |
| -eq | 数值相等 |
| -ne | 数值不等 |
| -le | 第一个数小于等于第二个数 |
| -ge | 大于等于 |
| -gt | 大于 |
| -lt | 小于 |