这几天也是刚学习了shell脚本的编写,虽然他不像Python、Java那样可以编写很大型的项目(固然我是这么认为),可是在操控Linux系统方面,仍是有独特的优点的,固然在学习过程当中咱们也能更好的了解Linux。接下来,就开始学习吧。后面会有几个小例子,固然都是别的地方挪过来的,我就是代码的搬运工,嘿嘿。喜欢学习的同志们能够点击Python聚焦专栏,查看更多知识。html
在通常状况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,因此,像 #!/bin/sh,它一样也能够改成 #!/bin/bash。python
#!/bin/bash
chmod +x ./test.sh # 修改权限 ./test.sh # 执行
运行时必定要写成./test.sh,由于直接写test.sh,linux会去PATH里寻找,而通常只有/bin,/sbin,/usr/bin,/usr/sbin等在PATH中,因此使用./test.sh告诉系统,就在本目录下找mysql
/bin/sh test.sh
定义方式和python相似,只不过定义过程当中不容许使用空格,默认都是字符串类型linux
declare命令定义有类型的变量nginx
语法 | 说明 |
---|---|
${var_name#规则} | 从变量开头进行匹配,将符合最短的数据删除 |
${var_name##规则} | 从变量开头进行匹配,将符合最长的数据删除 |
${var_name%规则} | 从变量末尾进行匹配,将符合最短的数据删除 |
${var_name%%规则} | 从变量末尾进行匹配,将符合最长的数据删除 |
${变量名/旧字符串/新字符串} | 变量内容符合旧字符串,就将第一个替换 |
${变量名//旧字符串/新字符串} | 变量内容符合旧字符串,就所有替换 |
Shell字符串正则表达式
在进行拼接的时候是能够出现如下形式的:sql
求长度shell
求字串索引数据库
expr index $str substr_regsegmentfault
匹配的字串的长度
截取
定义:
读取:
获取长度:
多行:
定义
返回值
局部变量
函数库
$* / $@:以一个单字符串显示全部向脚本传递的参数。
一个变量是否为0, [ $var -eq 0 ]
包含echo `expr 2 + 2` # 输出4
浮点数计算:bc
read命令
read -p "请输入一段文字:" -n 6 -t 5 -s password
echo
printf
printf "%s" jim
test:通常用于替换中括号
test $num = $num2
if . . . else
if condition then command1 elif condition1 then command2 else commandN fi
for . . . in
for var in data do command1 done
while
while condition do command done
死循环
while : do command done # 使用true while true do command done # 使用for for (( ; ; ))
case
case value in value1) command1 ;; value2) command2 ;; *) command2 ;; esac
# 语法格式: sed [option] "pattern command" file_name # 删除文件第一行 sed -i '1d' file_name
option选项
pattern
command
反向引用
在使用替换字符的时候,修改内容使用&表示使用被替换的条件
# 在匹配到^la..jim的后面加shuai # &:全匹配,\1:其使用了正则的分组,因此前面须要使用小括号括起来 sed -i 's/^la..jim/&shuai/g' sed.txt
# 语法格式: awk 'BEGIN{}pattern{commands}END{}' file_name
for user in `cat /etc/passwd | cut -d ":" -f 1` do echo "$user" done
nginx_num_process=$(ps -ef | grep nginx | grep -v grep | wc -l) if [ nginx_num_process -eq 0 ];then systemctl start nginx fi
while true do read -p "pls input a positive number: " num expr $num + 1 &> /dev/null if [ $? -eq 0 ];then if [ `expr $num \> 0` -eq 1 ];then for((i=1;i<=$num;i++)) do sum=`expr $sum + $i` done echo "1+2+3+....+$num = $sum" exit fi fi echo "error,input enlegal" continue done
this_pid=$$ while true do ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null if [ $? -eq 0 ];then echo "Nginx is running well" sleep 3 else systemctl start nginx echo "Nginx is down,Start it...." fi done
FILE_NAME=/root/lesson/5.6/my.cnf function get_all_segments { echo "`sed -n '/\[.*\]/p' $FILE_NAME | sed -e 's/\[//g' -e 's/\]//g'`" } function count_items_in_segment { items=`sed -n '/\['$1'\]/,/\[.*\]/p' $FILE_NAME | grep -v "^#" | grep -v "^$" | grep -v "\[.*\]"` index=0 for item in $items do index=`expr $index + 1` done echo $index } number=0 for segment in `get_all_segments` do number=`expr $number + 1` items_count=`count_items_in_segment $segment` echo "$number: $segment $items_count" done
sed -i '/[:blank:]*#/^$/d' config.cnf
sed -i 's/^[^#]/\*&/g' config.cnf
user="" password="" host="" mysql_conn="mysql -u"$user" -p"$password" -h"$host"" IFS=":" # 内置分隔符变量 cat data.txt | while read id name birth sex do $mysql_conn -e "insert into school values('$id','$name','$birth','$sex')" done
ftp -inv << EOF open ftp_ip_addr user user_name password put file_name bye EOF #必须顶格写
根据其余表的结构建立新表
mysqldumps备份mysql