同福

Shell学习笔记

基础

基本

语法

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