一、学命令以前的基础知识
1、shell 脚本的结构
首先给出一个示例
#!/bin/bash
# —————————————————————
# This script is used to understand the shell structure
# ————————————————————
echo "We are currently in the following directory."
/bin/pwd
正如上面的示例代码所示,shell 脚本的结构分成以下三部分:
2、创建 shell 程序的步骤
(1)创建一个包含命令和控制结构的文件
(2)修改这个文件的权限使它可以执行,chmod u+x
(3)执行 ./example 或者 sh example
3、执行脚本的权限
普通用户想要执行某个脚本,需要有如下条件:
(1)直接写路径以./example的形式执行:
(2)以 sh example 的形式执行
4、调试
(1)执行脚本,并显示所有变量的值
sh -x script
(2)不执行脚本,只是检查语法的模式,将返回所有语法错误
sh -n script
二、Shell 变量番外(1)
有两类:临时变量 和 永久变量
此外,还有一些特殊变量
变量 | 含义 |
---|---|
$* | 这个程序的所有参数 |
$# | 这个程序的参数个数 |
$$ | 这个程序的PID |
$! | 执行上一个后台命令的PID |
$? | 执行上一个命令的返回值,0代表成功,非0代表不成功 |
三、shell命令
read USERNAME
expr 3 + 1
expr `expr 5 + 7` / 3
# 注意,乘号 * 前面要加上转义符
expr 10 \* 4
awk -F域分隔符 '命令'
-F 用来指定域分隔符,最常用的域分隔符是空格和冒号,默认是空格
例子:
(1)检测系统中 UID 为 0 的用户
思路:在 /etc/passwd 文件中,将每一条信息以冒号:分割,若 UID = 0,则输出用户名
awk -F: '$3==0 {print $1}' /etc/passwd
(2)打印输出 PID 为 2441 的命令提示符名称
思路:先获取当前所有进程,再将每一条信息以空格分割,找出 PID 为 2441 的进程,但因其命令提示符名称
ps | awk '$1==2441 {print $4}'
#!/bin/shift
if [ $# -le 0 ]
then
echo "Not enough parameters"
exit 0
fi
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
done
echo $sum
四、变量测试语句
用于测试变量是否相等、是否为空、文件类型等
格式: test 测试条件
测试范围:整数、字符串、文件
一般作为 if 语句的测试条件if test -d $1 then ...
,不会单独使用
字符串测试
测试语句 | 通用写法 | 含义 |
---|---|---|
test str1==str2 | [ str1 == str2 ] | 是否相等 |
test str1!=str2 | [ str1 != str2 ] | 是否不相等 |
test str1 | [ str1 ] | 是否不为空 |
test -n str1 | [ -n str1 ] | 是否不为空 |
test -z str1 | [ -z test ] | 是否为空 |
整数测试
测试语句 | 通用写法 | 含义 |
---|---|---|
test int1 -eq int2 | [ int1 -eq int2 ] | 是否相等 |
test int1 -ge int2 | [ int1 -ge int2 ] | int1是否>=int2 |
test int1 -gt int2 | [ int1 -gt int2 ] | int1是否>int2 |
test int1 -le int2 | [ int1 -le int2 ] | int1是否<=int2 |
test int1 -lt int2 | [ int1 -lt int2 ] | int1是否< int2 |
test int1 -ne int2 | [ int1 -ne int2 ] | 是否不相等 |
文件测试
测试语句 | 通用写法 | 含义 |
---|---|---|
test -d file | [ -d file ] | 是否是目录 |
test -f file | [ -f file ] | 是否是常规文件(二进制文件) |
test -x file | [ -x file ] | 是否可执行 |
test -r file | [ -r file ] | 是否可读 |
test -w file | [ -w file ] | 是否可写 |
test -a file | [ -a file ] | 是否存在 |
test -s file | [ -s file ] | 文件大小是否非0 |
五、流程控制语句
#!/bin/bash
# if...then...
echo "please input a number"
read NUM
if [ $NUM -gt 0 ]
then
echo "the number > 0"
fi
(2) if [ … ] then … else … fi
#!/bin/bash
# if...then...else...
echo "please input a number"
read NUM
if [ $NUM -gt 0 ]
then
echo "the number > 0"
else
echo "the number <= 0"
fi
(3) if [ … ] then … elif … then … fi
#!/bin/bash
# if...then...elif...
echo "please input a number"
read NUM
if [ $NUM -gt 0 ]
then
echo "the number > 0"
elif [ $NUM -eq 0 ]
then
echo "the number = 0"
else
echo "the number < 0"
fi
(4) 多个条件的联合
-a:all,逻辑与
-o:or,逻辑或
#!/bin/bash
# -a
echo "please input a number"
read NUM
if [ $NUM -gt -1 -a $NUM -lt 1 ]
then
echo "-1 < number < 1 "
fi
# -o
echo "please input a string"
read STR
if [ $STR = "study" -o $STR = "learn" ]
then
echo " good boy "
fi
格式:
for 变量 in 名字表 do 命令列表 done
#!/bin/bash
# for...done
for DAY in MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY
do
echo "The day is : $DAY"
done
格式:
select 变量 in 关键字 do commond done
#!/bin/bash
# "select" Usage
echo "What is your favorite OS?"
select VAR in "Linux" "Unix" "Windows" "Other"
do
break
done
echo "You have selected $VAR"
格式:
case 变量 in 字符串1) commond_1 ;; ... 字符串n) commond_n ;; *) commond_* esac
#!/bin/bash
# case
echo "******************************"
echo "Please select your operation:"
echo " Press "C" to Copy"
echo " Press "D" to Delete"
echo " Press "B" to Backup"
echo "******************************"
read op
case $op in
C)
echo "your selection is Copy"
;;
D)
echo "your selection is Delete"
;;
B)
echo "your selection is Backup"
;;
*)
echo "invalide selection"
esac
格式:
while 条件 do commond done
#!/bin/bash
# while
num=1
while [ $num -le 10 ]
do
SUM=`expr $num \* $num`
echo $SUM
num=`expr $num + 1`
done
格式:
until 条件 do commond done
#!/bin/bash
# "until" usage
num=1
until [ $num -eq 10 ]
do
SUM=`expr $num \* $num`
echo $SUM
num=`expr $num + 1`
done
跳出循环
break:跳出整个循环
continue:跳过本次循环,进行下次循环
函数
functionName() { commond }
函数调用:直接写函数名,不带括号
functionName arg1 ... argn
函数中的变量:均为全局变量,没有局部变量
函数中的参数:调用函数时,可以传递参数,在函数中用 $1、$2 … 来引用
#!/bin/bash
# function
HELP()
{
echo "Usage: sh function \$1 \$2 \$3"
}
if [ $# -ne 3 ]
then
HELP
else
echo "thanks for your input, the three arguments is 1 2 3."
fi
(1)set 列出所有已定义变量
unset ABC 删除一个变量
(2)单引号 vs 双引号
输入 | 输出 |
---|---|
ABC=’time is $DATE’ | time is $DATE |
ABC=”time is $DATE” | time is Fri Aug 25 06:04:50 PDT 2017 |
(3)几个命令
1)exit 0 退出程序执行,并返回一个返回码,返回码为 0 表示正常退出,非 0 表示非正常退出
2)ps -aux 显示进程启动用户的身份
3)kill -9 强行关闭