文章目录
前言
Shell脚本最好以".sh"为后缀,Shell脚本程序以"#!/bin/bash"开始。(注释符号:#)
一、Shell变量
Shell变量没有数据类型,都是字符串,即使数值也是字符串。
1.创建变量
变量名称=值
如果值有空格则必须用" "或’ '引起来。
示例:
a="hello" ("="号两边不能有空格)
2.引用变量
echo $a 或 echo ${a} 或 echo “${a}”
注意’ ‘(单引号)与" “(双引号)的区别:单引号消除所有字符的特殊意义;双引号消除除$、” "、’ '以外其他字符的特殊意义。
示例:
echo $a ->hello
echo "${a}a" ->helloa
echo '${a} a' ->${a}a
3.删除变量
unset 变量名
unset a
4.设置变量为只读变量
readonly a=3
也可从键盘输入:
read a
5.显示上条命令执行结果或函数返回值
echo $? (0表示成功,1表示失败)
转义符" \ "
a="What's your \"topic\"?"
命令替换
echo ‘命令’ 等价于 echo $(命令)
显示当前系统时间:
echo `date`(小飘号) 或 echo $(date)
6.表达式计算
echo $(expr 4+5) 或 echo ‘expr 4+5’ 或 echo $((4+5)) 或 echo $[4+5] 或 expr 4+5
二、标准变量
标准变量(或环境变量)是系统预定义的变量,一般在/etc/profile中进行定义,用env查看所有环境变量,用" env | grep “name” “来查找。
HOME:用户的主目录
IFS:表示内部字段分隔符
LOGNAME:登录名
MAIL:用户邮箱存放的位置
MAILCHECK:用户的邮箱检查是否有新邮件时间间隔,默认60s
MAILPATH:用户有多个邮箱时,mail存在哪几个文件中,格式和 PATH变量一样
TERM:用户登录系统的终端类型,默认是vt100
PATH:可执行文件寻找的路径
TZ:表示时区
PS1:登录系统的提示符
PS2:命令提示符,需要输入多行时的提示符。默认是”>"
PWD:当前目录
SHELL:当前运行的shell
MANPATH:帮助文档存放的路径
TERMINFO:终端类型的配置信息
设置环境变量的方法,如将"/etc/apache/bin"目录添加到PATH中,只针对当前用户有效,步骤如下:
(1)#PATH=$PATH:/etc/apache/bin;
(2)vi /etc/profile,在里面添加"PATH=$PATH:/etc/apache/bin";
(3)vi ~/.bash_profile,在里面修改PATH行,把"/etc/apache/bin"加进去。
用"export"进行设定或更改为全局变量,用"#unset 变量名"取消全局变量的定义。
三、特殊变量
(1)$1,$2,…,$n 传入的参数($0表示Shell程序名称),其中每一项相当于main函数中argv[i];
(2)$# 传递到脚本的参数列表,或表示参数个数,相当于main函数的argc-1;
(3)$@ 传入脚本的全部参数:argv[1], …, argv[n-1];
(4)$* 显示脚本全部参数;
(5)$? 前个命令的执行情况,0表示成功,1表示失败;
(6)$$ 脚本运行的当前进程号;
(7)$! 运行脚本的最后一个命令。
四、变量赋值
变量赋值的5种格式:
(1)${variable name} 显示实际值;
(2)${variable name:+value} 若设置了variable name,就把value值显示出来,未设置就显示空;
(3)${variable name:-value} 若设置了variable name,就把值显示出来,未设置就显示value值;
(4)${variable name:?value} 若未设置,就提示用户错误信息value;
(5)\${variable name:=value} 若未设置,就显示value值。
五、运算符与表达式
运算符包括:
(1)算术运算符(+、-、*、/、%);
(2)逻辑运算符(&&、||、>、==、<、!=);
(3)赋值运算符(=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=)。
计算表达式包括:
(1)$(());(2)$[];(3)let var=;(4)expr 4+5。
六、test命令的用法
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
(1)判断表达式(and,or)
test 表达式1 -a 表达式2(两个表达式都为真)
test 表达式1 -o 表达式2(两个表达式有一个为真)
(2)判断字符串
test -n 字符串:字符串的长度非零
test -z 字符串:字符串的长度为零
test == 字符串:字符串相等
test != 字符串:字符串不等
(3)判断整数
test 整数1 -eq 整数2:整数相等
-ge 表示大于等于;
-gt 表示大于;
-le 表示小于等于;
-lt 表示小于;
-ne 表示不等于。
(4)判断文件
test File1 -ef File2:两个文件具有同样的设备号和i节点
test File1 -nt File2:文件1比文件2新
test File1 -ef File2:文件1比文件2旧
test -b File:文件存在且是块设备文件
test -c File:文件存在且是字符设备文件
test -d File:文件存在且是目录
test -e File:文件存在
test -f File:文件存在且是普通文件
test -g File:文件存在且设置了组ID
test -G File:文件存在且属于有效组ID
test -h File:文件存在且是符号链接(同L)
test -k File:文件存在且设置了sticky位
test -L File:文件存在且是符号链接(同h)
test -o File:文件存在且属于有效用户ID
test -p File:文件存在且是命名管道
test -r File:文件存在且可读
test -s File:文件存在且是套接字
test -t File:是在终端打开的文件描述符
test -u File:文件存在且设置了set-user-id位
test -w File:文件存在且可写
test -x File:文件存在且可执行
七、数组
定义1:a=(1 2 3 4 5) #从0开始,各个数据之间用空格隔开
定义2:a[0]=1;a[1]=2;a[2]=3
定义3:a=([1]=1 [2]=2)
引用:
${a[2]} #下标为2的数据
${#a[*]} #数组的长度
${a[@]:2} #截取下标从2到最后
${a[@]:1:2} #截取从下标1到后面2个
八、if语句
语法:
if [condition]
then action
elif [condition2]
then action2
else actionx
fi
在使用时,将"if"和"then"放在不同行;若同行放置,则if语句必须要用";"结束。
九、case语句
常用语法:
case $1 in
"1")
echo you inputed "1"
;;
"2")
echo you inputed "2"
;;
*)
echo you inputed other number
;;
esac
十、for循环
示例:
for x in one two three four
do
echo number $x
done
十一、while语句
常用语法:
myvar=0
while[$myvar -ne 10]
do
echo $myvar
myvar=$(($myvar+1))
done
十二、untile语句
常用语法:
myvar=0
untile[$myvar -eq 10]
do
echo $myvar
myvar=$(($myvar+1))
done
十三、Shell函数
函数名() { 命令1 … …}
function 函数名() { … …}