*** 付出什么你就得到什么,如果你付出是最大的努力,你就可以获得最好的报酬。
你只要去写下第一行shell,你就会发现它真的不是很难!去写下第一段自己的脚本吧!哪怕是自己输出一个hello world。
解释器
脚本第一行包含解释器的路径,用于指定shell用什么解释器执行
常用的有bash sh
新建一个脚本 script.sh
#!/bin/bash
# 注意上面#!和解释器之间不能有空格
whoami
修改权限
chmod a+x script.sh
脚本执行方式
bash script.sh
./script.sh # 已经增加可执行权限可使用这个方法
输出 & 重定向输出
echo -n "my user:" # -n 选项可输出不带换行的文本
whoami
echo -e "hello world!/n" # -e 启用反斜线转义 常常配合/n新行 等转义符合使用
# 输出重定向 将文件内容清除,添加{inset}
echo "{inset}" > init.d
# 输出追加重定向 向文件后面追加{inset}
echo "{inset}" >> init.d
变量
# 数字
PI=3.14 # 等号左右不要有空格
# 字符串
name="jiafeng"
# 使用变量 下面两种都可以,但建议使用第一种,其他就不做介绍了。
# 字符串可以使用加号拼接 ${name}+${name}
echo ${name}
echo $name
判断语句
# if else elif
if [ command ]; then
符合判断执行的语句
fi
###### 注意空格 if 空格 [空格 command 空格];
if [ command ]; then
语句3
elif [ command2 ]; then
语句2
else
语句1
fi
如果忘记在语句中加入空格,会报语法错误,记得检查。
评估数值
#!/bin/bash
age=18
if [ ${age} -lt 20 ]; then
echo "age < 20; -lt 代表小于"
fi
判断数值的方式
-gt (大于 >)
-ge (大于或等于 >=)
-lt (小于 <)
-le (小于或等于 <=)
-eq (等于)
-nq (不等于)
评估字符串
#!/bin/bash
my_name="jiafeng"
name1="jiafeng"
name2="jiaXiaoFeng"
# ## 比较两字符串是否相等
if [ ${my_name} == ${name2} ]; then
echo "${my_name} == ${name2}"
elif [ ${my_name} == ${name1} ]; then
echo "${my_name} == ${name1}"
fi
判断字符串方式
&& (与)
|| (或)
== (相同)
!= (不相同)
-n (字符串长度不为空)
-z (字符串长度为空)
评估文件
#!/bin/bash
file_name="init.d"
if [ -f ${file_name} ]; then
echo "init.d Exist"
else
echo "init.d Not Exist"
fi
判断文件方式
#### 如果符合条件,则f返回真
-e 文件存在
-f 普通文件 并非目录或设备文件
-s 文件大小不为空
-d 目录
-r 具备读权限
-w 具备写权限
-x 具备可执行文件
常用$用法
#!/bin/bash
echo -e "\$0 ="$0 # shell脚本的名称
echo -e "\$1 ="$1 # shell脚本第一个参数
echo -e "\$2 ="$2 # shell脚本第二个参数
pwd
echo -e "\$? = "$? # pwd 命令成功返回0
阶段实战
eg:检查备份并增加新内容脚本
#!/bin/bash
# bak
FLAG="bak"
FILE_NAME="init.d.bak"
# 如果输入的第一个参数是bak则需要备份
if [ $1 == ${FLAG} ];then
# 检查备份文件是否存在
if [ -f ${FILE_NAME} ];then
echo "init.d.bak File Exist"
else
echo "init.d.bak File not Exist"
cp init.d init.d.bak # copy init.d
fi
fi
# 在init.d 末尾增加一段文字
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
" >> init.d
通过下面的输出我们可以看到,执行脚本之后,进行了备份,并将echo重定向输出到了init.d文件的末尾。