基础
基本
语法
shell是一个脚本,不是程序,需要通过解析程序执行。解析程序一笔情况下为 /bin/sh,需要在脚本内容第一行声明。
[root@localhost]# vi helloworld.sh #!/bin/sh echo "helloworld"
shell是linux的产物,linux没有“扩展名”概念,也就是说扩展写什么都无所谓。不过,为了区别其他类型的文件,我们习惯上还是会给加上一个扩展名 sh。
执行
通过 /bin/sh 执行
/bin/sh helloworld.sh
授权执行
chmod 0755 helloworld.sh ./helloworld.sh
技巧
变量
普通
var="hello" echo $var echo ${var}
数学表达式
可以通过 $((...)) 语法将一个数学表达式的结果作为变量
for i in {1..10} do echo $(( (i==6) ? i*100 : i )) done
判断
if
if [ "" = "$var" ] && [ "" = "$var" ] ; then fi
循环
for
第一种方法
for i in $(seq 1 10) do done
第二种方法
for ((i=1;i<=10;i++)); do done
第三种方法
for i in {1..10} do done
while
while [ 1 ] ; do done
字符串替换
sed
在sed中引入外部变量的方法
name="tongfu" echo "who is engineer!" | sed 's/who/'"${name}"'/'
使用sed替换文件的内容
echo "abcdef" > file1 sed 's/cd/CD/' file1 abCDef
使用sed替换文件的内容并保持到文件
echo "abcdef" > file1 sed -i 's/cd/CD/' file1
字符串格式化
awk
在awk中使用行数(行号)
touch file1 echo "zhang 3" >> file1 echo "li 4" >> file1 echo "wang 5" >> file1 cat file1 | awk '{print NR, $0}' 1 zhang 3 2 li 4 3 wang 5
在awk中引入外部变量的方法
touch file1 echo "zhang 3" >> file1 echo "li 4" >> file1 echo "wang 5" >> file1 linenum=2 cat file1 | awk '{printf("name of list is '%s'%s\n", $0, (NR == '"${linenum}"')?"(current)":"")}' name of list is zhang 3 name of list is li 4(current) name of list is wang 5
正则表达式
特殊字符
空格 - [:space:]
Tab - [\t]
换行符 - [\r\n]
首位匹配
如果要从目标第一个字符开始匹配,则需要使用字符“^”
示例判断字符串是否为“#”开头
echo $str | sed -n '/^\#/p'
末位匹配
如果要从目标最后一个字符开始匹配,则需要使用字符“$”
示例判断字符串是否是“.”结尾
echo $str | sed -n '/\.$/p'
条件选择
case
使用case实现switch语句的功能
case $var in case1) # statement case 1 ;; case2) # statement case 2 ;; *) # statement case out esac
数组
定义
定义一个数组
arr1=(100 200 300 400 500 600)
定义一个包含各种类型元素的数组
arr2=(1 "2" 3.1 "four" "五" "陆")
定义一个指定元素下标的数组
arr3=([10]=100 [20]=200 [30]=300 [40]=400 [50]=500 [60]=600)
获取元素
获取数组下标为3的元素
${arr[3]}
获取数组所有元素
${arr[*]} ${arr[@]}
Screen使用
screen就是linux的窗口操作,可以将一个持续任务再窗口里操作而不会因为注销用户而中断进程
创建窗口
screen -S [窗口名称]
退出窗口
使用Ctrl + D退出当前窗口
或者
screen -d [窗口名称]
查看窗口
screen -ls
恢复窗口
screen -r [窗口名称]
常用命令
查看服务端口
netstat -tunlp
查看服务器NAT列表
iptables -t nat -L iptables -t nat -vnL PREROUTING
开放服务端口
CentOS 6
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
CentOS 7
firewall-cmd --zone=public --add-port=22/tcp
关闭服务端口
CentOS 6
iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT iptables -D OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
CentOS 7
firewall-cmd --zone=public --remove-port=22/tcp
重启防火墙
CentOS 6
service iptables restart
CentOS 7
systemctl restart firewalld
查看执行过程
sh -x yourshell.sh
执行过程写入文件
sh -x yourshell.sh &> log