命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
输入模式:正常的文本录入。
末行模式:保存或退出文档,以及设置编辑环境。
a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 o 键则是在光标的下面再创建一个空行,此时可敲击 a 键进入到编辑器的输入模式。
Shell 脚本命令的工作方式有两种:交互式和批处理。交互式用户每输入一条命令就立即执行;批处理由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本中诸多的命令。
使用 Vim 编辑器把 Linux 命令按照顺序依次写入到一个文件中,就是一个简单的脚本。第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本;第二行的注释信息(#)是对脚本功能和某些命令的介绍信息。此外,第二种运行脚本程序的方法是通过输入完整路径的方式来执行(需要为脚本文件增加执行权限)。
bash example.sh
#!/bin/bash #For Example BY linuxprobe.com pwd ls -al
Shell 内设了用于接收参数的变量,变量之间可以使用空格间隔。$0 对应当前 Shell 脚本程序的名称,$# 对应总共有几个参数,$* 对应所有位置的参数值,$? 对应上一次命令的执行返回值,$1、$2、$3……分别对应着第 N 个位置的参数值。
条件表达式
条件测试语法:[ 条件表达式 ] 判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。可以分为 4 种:文件测试语句、逻辑测试语句、整数值比较语句、字符串比较语句。(条件表达式两边均应有一个空格)
# 判断/etc/fstab 是否为一般文件 [ -d /etc/fstab ] echo $? # 若存在则输出 Exist 字样 [ -e /dev/cdrom ] && echo "Exist" [ $USER = root ] || echo "user" [ ! $USER = root ] || echo "administrator" [ ! $USER = root ] && echo "user" || echo "root"
[ 10 -gt 10 ] echo &? free -m | grep Mem: | awk '{print $4}'
字符串比较语句经常用来判断某个变量是否未被定义(即内容为空值)。
[ -z $String] [ $LANG != "en.US" ] && echo "Not en.US"
流程控制语句
1)if 条件测试语句: if、then、elif、else、fi
#!/bin/bash DIR="/media/cdrom" if [ ! -e $DIR ] then mkdir -p $DIR fi #!/bin/bash # /dev/null 是一个被称作 Linux 黑洞的文件 # 把输出信息重定向到这个文件等同于删除数据 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null if [ $? -eq 0 ] then echo "Host $1 is On-line." else echo "Host $1 is Off-line." fi #!/bin/bash read -p "Enter your score(0-100):" GRADE if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then echo "$GRADE is Excellent" elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then echo "$GRADE is Pass" else echo "$GRADE is Fail" fi
2)for 条件循环语句:for … in 、do、done
#!/bin/bash read -p "Enter The Users Password : " PASSWD for UNAME in `cat users.txt` do id $UNAME &> /dev/null if [ $? -eq 0 ] then echo "Already exists" else useradd $UNAME &> /dev/null echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null if [ $? -eq 0 ] then echo "$UNAME , Create success" else echo "$UNAME , Create failure" fi fi done
3)while 条件循环语句:while、do、done
#!/bin/bash PRICE=$(expr $RANDOM % 1000) TIMES=0 echo "商品实际价格为 0-999 之间,猜猜看是多少?" while true do read -p "请输入您猜测的价格数目:" INT let TIMES++ if [ $INT -eq $PRICE ] ; then echo "恭喜您答对了,实际价格是 $PRICE" echo "您总共猜测了 $TIMES 次" exit 0 elif [ $INT -gt $PRICE ] ; then echo "太高了!" else echo "太低了!" fi done
4)case 条件测试语句:case…in、)、esac
#!/bin/bash read -p "请输入一个字符,并按 Enter 键确认:" KEY case "$KEY" in [a-z]|[A-Z]) echo "您输入的是 字母。" ;; [0-9]) echo "您输入的是 数字。" ;; *) echo "您输入的是 空格、功能键或其他控制字符。" esac
计划任务服务程序
计划任务分为一次性计划任务(写成“at 时间”的形式,查看已设置好但还未执行的一次性计划任务使用“at -l”命令;将其删除用“atrm 任务序号”),与长期性计划任务(创建、编辑计划任务的命令为“crontab -e”,查看当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为“crontab -r”)。
# 交互式编写 at 23:30 at > systemctl restart httpd at > # 此处请同时按下 Ctrl + D 组合键来结束编写计划任务 # 使用管道非交互式 echo "systemctl restart httpd" | at 23:30
crontab -e 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot