shell编程
命名规则
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)
变量赋值
your_name="libai"
# 变量名和等号之间不能有空格
使用变量
your_name="libai"
echo $your_name
echo ${your_name}
# 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
删除变量
#!/bin/sh
myname="libai"
unset myname # 删除变量
echo $myname # 没有任何值输出
变量类型
- 局部变量** 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量** 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量** shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
字符串
单引号字符串
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号字符串
- 双引号里可以有变量
- 双引号里可以出现转义字符
your_name='libai'
str="Hello,\"$your_name\"! \n"
删除变量
unset 变量名
位置参数
$0 为脚本的名字,
$1 表示第一个参数,
$2 表示第二个参数,
…
${10} 表示第十个参数,
$# 传递到脚本的参数数量
$@或$* 表示从$1开始的全部参数.
$? 上一条命令的退出状态,0表示没有错误
$$ 脚本运行的进程号
命令替换
- 命令替换,是将命令的标准输出作为值赋给某个变量。
bash Shell中有两种形式: `命令` 和 $(命令)。
$(命令)
例: PD=$(pwd)
`命令`
例: PD=`pwd`
逻辑控制
- Shell脚本中还可以包含各种控制结构,if-else分支语句,case分支语句,for循环,while循环等。
test "$answer" = "yes"
# 变量answer的值是否为字符串yes
test $num –eq 18
# 变量num的值是否为整数18
test -d tmp
# 测试tmp是否为一个目录名
-
字符串测试
s1 = s2 测试两个字符串的内容是否完全一样 s1 != s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是否为0 -n s1 测试s1 字符串的长度是否不为0 -
整数测试
a -eq b 测试a 与b 是否相等 a -ne b 测试a 与b 是否不相等 a -gt b 测试a 是否大于b a -ge b 测试a 是否大于等于b a -lt b 测试a 是否小于b a -le b 测试a 是否小于等于b -
文件测试
-d name 测试name 是否为一个目录 -f name 测试name 是否为普通文件 -L name 测试name 是否为符号链接 -r name 测试name 文件是否存在且为可读 -w name 测试name 文件是否存在且为可写 -x name 测试name 文件是否存在且为可执行 -s name 测试name 文件是否存在且其长度不为0 f1 -nt f2 测试文件f1 是否比文件f2 更新 f1 -ot f2 测试文件f1 是否比文件f2 更旧
if语句
语法结构1:
if 表达式
then 命令表
fi
语法结构2:
if 表达式; then
命令表
fi
如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用; 命令表中的命令可以是一条, 也可以是若干条
多条分支case/esac
例子
read YES_OR_NO
case "$YES_OR_NO" in
yes|y|Yes|YES)
echo "Good Morning!";;
[nN]*)
echo "Good Afternoon!";;
*)
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
esac
case表示case语句块的开始,esac表示case语句块的结束。
Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以分号结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后.
for循环
语法结构:
for 变量名 in 单词表
do
命令表
done
while循环
- while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
语法结构:
while 命令或表达式
do
命令表
done
until循环
- until循环与while循环的功能相似, 所不同的是只有当测试的命令或表达式的值是假时, 才执行循环体中的命令表, 否则退出循环。
语法结构:
until 命令或表达式
do
命令表
done
shell函数
在shell程序中, 常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。
函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。
调用程序可传递参数给函数, 函数可用return语句把运行结果返回给调用程序。
函数只在当前shell中起作用, 不能输出到子Shell中。
语法结构:
function_name ( )
{
command1
……
commandn
}
调用方式
#方式1
value_name=`function_name [arg1 arg2 … ]`
# 方式2
function_name [arg1 arg2 … ]
echo $?
例子
check_user( ) #查找已登录的指定用户
{
user=`who | grep $1 | wc -l`
if [ $user –eq 0 ]
then
return 0 #未找到指定用户
else
return 1 #找到指定用户
fi
}
while true # MAIN, Main, main: program begin here
do
echo "Input username: \c"
read uname
check_user $uname # 调用函数, 并传递参数uname
if [ $? –eq 1 ] # $?为函数返回值
then echo "user $uname online"
else echo "user $uname offline"
fi
done