脚本
Linux系统中脚本大多以sh为后缀名,基于bash文件运行,bash相当于是sh文件的编译器。在编写sh文件时,应在头部写上#!/bin/bash
。
变量
本地变量
即在当前的脚本或环境中可以调用的变量。
定义本地变量和调用:
name=hwq #定义
echo ${name} #调用
echo不仅可以向文件插入内容,也可以用来调用变量,结果类似于java中的System.out.println()
或python中的print()
。
访问变量都需要在变量前加上$
,但是一些特殊的变量需要加上${}
才可以访问,如数组,所以就统一所有变量都使用${}
访问。
用户变量
即在使用定义变量的用户时可以访问的变量。管理用户变量的文件是用户主目录下的.bash_profile文件,需要使用ls -a
才能看到
创建用户变量:
cd #返回用户住目录
vi .bash_profile
进入.bash_profile的编辑模式,插入语句export NAME_TEST=hwq
,一般来说除了本地变量,其他的变量最好都用全大写的形式。
完成修改后,:wq
保存修改并source .bash_profile
。之后,便能在当前用户访问NAME_TEST这个变量了,但如果切换用户就不能访问了。
环境变量
环境变量又称全局变量,可以在当前系统中被访问。如jdk的环境变量JAVA_HOME,便是如此。定义环境变量需要在/etc/profile
中。
位置参量
概念:主要是向脚本中传递数据,变量名不能自定义,变量作用是固定的。
位置参量 | 用途 |
---|---|
$n | n表示整数,即第几个传入的参数,当n>=10,需要写成如${10}、${12} 的形式 |
$* | 将接收所有的参数拼接成一个字符串,字符串的分隔符以脚本中分割变量的分隔符为准 |
$@ | 代表命令行的 所有参数代表一个整体,不过把每个参数区分对待 |
$? | 上条命令执行是否成功,0代表成功,其他任意数字都代表失败 |
$! | 后台运行的最后一条命令的进程号 |
$$ | 当前运行命令的进程号 |
$0 | 运行该脚本的方式 |
示例
脚本:
#!/bin/bash
echo "Hello $1 $2 $3!!!"
echo $0
echo $#
echo $*
echo $!
echo $?
测试结果:
脚本运行语句
./test.sh
. test.sh
sh test.sh
上面3条语句均可运行脚本,常用. test.sh
这种方式
脚本中使用date命令
date +%Y-%m-%d,可指定日期按“年-月-日”的格式输出,更多的设置可以查看date命令的帮助
示例
脚本:
#!/bin/bash
date1=$(date +%Y-%m-%d)
echo "今天是${date1}"
date2=$(date --date='2 days ago' +%Y-%m-%d) # --date='n days ago'是date命令的扩展用法
echo "两天前是${date2}"
date3=$(date --date='-2 days ago' +%Y-%m-%d)
echo "两天后是${date3}"
测试结果:
值得注意的是,在调用系统命令来生成变量是使用的是$()
。
当一个变量以"$[变量名]"
的形式调用时,实际不只调用了这个变量而且将结果转为字符串来输出,同时可以在""中加入更多内容来达到字符串拼接或格式化输出的目的。
if判断
格式
if [条件1] then
something #执行语句
elif [条件2] then
something #执行语句
else
something #执行语句
fi #终结if语句,必须要有fi
elif和else均非必须,但是if…if是必须的。
if判断参数
字符串判断:
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
数字判断:
int1 -eq int2 两数相等为真
int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真
文件相关的判断:
-b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
逻辑运算符:
-a 与
-o 或
! 非
示例
#!/bin/bash
SYSTEM="$(uname -s)" # 获取操作系统类型
if [ $SYSTEM = "Linux" ] ; then
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi
for循环
示例:
#!/bin/bash
for var in 1 2 3 4 5
do
echo $var
done #done表示循环体终止
echo "-------------------"
num=10
sum=0
for((i=0;i<$num;i=i+1))
do
sum=$(($sum+$i)) #如果直接写为$sum+$i的形式,结果将会是字符串拼接
done
echo $sum
echo "--------------------"
arr=(1 2 3 4 5 6) #遍历数组
for i in $(seq 0 ${#arr[@]}) #${#arr[@]}可以获取数组的长度
do
echo ${arr[$i]}
done
测试结果:
while循环
while循环配合cat命令实现打印文件内容
代码:
#!/bin/bash
site_file=$1
if [ -f "${site_file}" ];then
cat ${site_file} | while read line
do
echo ${line}
done
else
echo "没有这个文件"
fi
测试结果: