收藏文章 楼主

shell 脚本基础大全

版块:shell   类型:精华   作者:小绿叶技术博客   查看:2553   回复:2   获赞:2   时间:2019-10-08 11:26:08


脚本编写前,先了解文件的权限属性

d r-x r-x r-x . 20 root root  4096 Oct 21 13:10 ..


 rwx = 4+2+1 = 7 # 文件权限 4 2 1 读-写-执行

 r 读取:4  w写入:2 x执行:1 - 没有权限(如:r-x 中的 -)

 d 目录 - 文件 I 连接文档 b储存接口, c串行端口设备,


1-3位 所有者权限 owner

4-6位 所有者的同组用户权限 group

7-9位 其他用户拥有该文件的权限 others


-----------------  执行脚本的方法  --------------

chomd a+x xxx.sh #给脚本赋权限

chomd 777 xxx.sh


source xxx.sh  #执行脚本的方法

./xxx.sh

/bin/sh xxx.sh

/bin/php xxx.php

clear  # 清空命令界面

cat /dev/null > /root/1.sh  # 清空文件字符串(文件内的字符)


------------- 编辑shell 脚本  ------------


cat >xxx.sh<< END    

#!/bin/bash

a="小绿叶技术博客" # 定义变量a 为一个字符串

echo =$a # 响应这个变量

END # 结束写入标记,与开头的END一样





liunx 三剑客:linux 三剑客 grep awk sed

shell 增删改查-文件操作: https://www.eisc.cn/index.php?c=read&id=165&page=1&cache=refresh

awk编程:https://www.eisc.cn/index.php?c=read&id=163&page=1&cache=refresh

数组


--------  接收用户输入信息,在命令中传字符串到文件 --------------

#!/bin/bash

rm -rf /www/wwwroot/www/.well-known/pki-validation/fileauth.txt

touch /www/wwwroot/www/.well-known/pki-validation/fileauth.txt

# 操作文件为新空文件


for i in "$*"; do

# 符号* 换成@ 将识别命令界面输入的空格为换行

# i in "$*" 定义参数i 是变量 "$*"   ;变量i 是 “$*”用户 输入得来的


        echo "$i" >> /www/wwwroot/www/.well-known/pki-validation/fileauth.txt

# 将命令界面的参数传入文件


done #结束


cat /www/wwwroot/www/.well-known/pki-validation/fileauth.txt

# 查看效果


chomd a+x ssl.sh # 可执行权限

./ssl.sh 12345678 # 执行脚本并传入参数为12345678


----------- 指定查找元素  ----------

#!/bin/bash

x=(A B "CDEF" D)


echo "第一个元素为: ${x[0]}" # ${x[0]} 是一个整体变量

echo "第二个元素为: ${x[1]}" # x 变量 [1] 是 B,机器从0开始计数

echo "第三个元素为: ${x[2]}" # ${x[2]} 是一个整体: CDEF  

echo "第四个元素为: ${x[3]}


#!/bin/bash

x[0]=a # 定义x的第一个变量值为 a

x[1]=b

x[2]=cvb

echo "数组的元素为: ${x[@]}" # @  是换行显示所以值

echo "数组个数为:${#x[*]}" # *  不换行显示所有字符


运算符

#!/bin/bash

a=10

b=20


val=`expr $a + $b` # 将 + 符号换成: 减-    乘 \* 除 /  取余 %

echo "a +b = $val" # 响应一个字符串, 和变量的值 $val


if [ $a == $b ] # if 如果,then 然后, echo 响应,fi 结束字句

then  # [ $a == $b ]  用绝对等于符号判断两个字符串

        echo "a 等于 b "

fi


---------  逻辑运算符号符合条件就返回true  ------------

#相等 -eq    不相等 -ne     大于  -gt     大等于  -ge     小于  -lt       小等于  -le


# 非运算 !     或运算 -o 与运算 -a

[ $a != $b ] # 变量:a 不等于 b, 非运算

[ $a -lt 60 -a  $b -gt 15] # 变量:a <60   且  b>15 与运算

[ $a -lt 100 -o $b -gt 100 ] # 变量:a<100  或  b> 100 或运算


&& # 相当于与运算,满足所有条件;也用于前面成功完成才执行后面

|| # 相当于或运算,满足一个条件就可以;前面无论成功失败就执行后面


= 字符串是否相等; != 判断是否不相等; -z 字符串长度为0;

-n 字符串长度不相等; $ 字符串为空


#--- 打印字符串长度 ----#

a="123456789" ; echo ${a: 3: 4-2}   # echo ${ }  是计算函数,所以:4-2 等于2   如果为负数是倒数,需要添加空格指定

                                                         # 截取第3个字符后面的2个字符(不包含第3)

echo ${#a}                                        # 打印字符串长度


文件信息判断将值传给变量

用来判断文件的参数:

-r 可读    -b块设备文件    -c 字符设备    -d 目录    -f 普通文件    -g SGID位    -k站着位stick bit 

-p 管道    -u SUID  -r 可读          -w 可写 -x 执行 -s 文件为空 -e 文件存在   


touch 888

vi 1.sh

#!/bin/bash

file="888" #定义变量

if [ -r $file ] # -r 检测文件是否可读

then

        a0="888文件可读"

else

        a0="888不可读"

fi


if [ -b $file ]

then

        a1="是块设备文件"

else

        a1="不是块设备文件"

fi


echo $a0+$a1

printf

----------------------------  printf  格式控制字符串  -----------------------

格式替代符为:%s %c %d %f


vi 2.sh

#!/bin/bash

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  

# %-10s  宽度间隔为10个字符,间隔分别为:10,8,4;本句有三列,按照此规则进行间距


printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 

# %-4.2f 格式化为小数,其中2表示保留2位小数


printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 

printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 


----------------------------  printf  的转译字符  ----------------

\a 警告字符    \b 后退    \c 抑制结尾换行符    \f 换页    \n 换行    \r 回车    \t 水平制表符   

\v 垂直制表符    \\ 字面反斜杠字符   \ddd 1~3位数八进制字符    \0 dddd 1~3位八进制字符


printf "%s %s %s\n" a b c d e f g h i j f 

# 有三个符号 %s  是分为三列,其它字符用 \n 换行显示


printf "%s and %d \n" 

# 若没有参数 a b c 等;符号%s返回为空;%d返回0,有参数返回它本身




------------------------  test  ------------------------

字符串参数:

-eq 等于为真    -ne 不等于为真    -gt 大于为真    -ge 大等于为真    

-lt 小于为真      -le 小等于为真 

= 等于    != 不等于    -z 字符串长度为0   -n 字符长度不为0 


文件参数:

-e 文件存在    -r 文件可读    -w 文件可写    -x 可执行    -s 文件存在字符    

-d 存在目录    -f 存在文件    -c 文件存在特殊字符    -b 特殊块文件


实例:

mkdir -p 1/2/3 # -p 当父目录不存在时先创建

vi 1.sh


#!/bin/bash

if test -e 1.txt -o -e 2.txt           # -o 或运算   -e 判断文件存在

then

    echo '至少有一个文件存在!'

else

    echo '两个文件都不存在'

fi



shell 流程控制语句 

------  if else-if else  ----

#!/bin/bash

a=10; b=20 # 定义参数,用 ; 和空格隔开,或者换行

if [ $a == $b ] # 判断变量 == 绝对等于。if 如果,fi结束

then #  then 然后

   echo "a 等于 b" # echo 响应

elif [ $a -gt $b ] # elif 否则如果

then

   echo "a 大于 b"

elif [ $a -lt $b ]

then

   echo "a 小于 b"

else

   echo "没有符合的条件"

fi


x=$[2*3] # 定义变量的值

y=$[1+5]

if test $x -eq $y #  if test 如果文本 -eq 相等

then

    echo '两个数字相等!'

else

    echo '两个数字不相等!'

fi


--------  for循环  -------

for loop in 1 2 3 4 5 # 换行显示字符串

do

    echo "The value is: $loop"

done

----------


for str in '1 2 3 4 5' # 不换行显示字符串

do

    echo $str

done

-----------


#!/bin/bash

for((i=1;i<=5;i++));do

    echo "这是第 $i 次调用";

done;



----------  whlie  ----------

#!/bin/bash

x=1 # 定义变量 x 初始值

while(( $x<=5 )) # while 与此同时,变量x 要小等于5

do # do 开始 ,done结束 循环

    echo $x # 响应 x 变量的值

    let "x++" # let 让   变量 x 自动增加值

done # 结束


------

while read x # 接收用户输入信息,变量为 x

do

    echo "是的!$x 是一个好网站"

done


---------------  until 循环  --------------

until  [ənˈtɪl] 直到...为止:为 true 才停止



a=0

until [ ! $a -le 5 ] # until 与 while 一样要写在开头,le 小等于 5

do

   echo $a

   a=`expr $a + 1` # a的值等于 expr :表达式;公式:变量自己加1 (自增1)

done



=================  多选择判断语句  ==============

------------  case  ---------

echo '你将要输入的数字为:'

read x # read [riːd] 读取变量的值

case $x in # case [keɪs] 事例;  x 在下面数字中匹配到就响应字符串

    1)  echo '你选择了 1'

    ;;

    2)  echo '你选择了 2'

    ;;

    3)  echo '你选择了 3'

    ;;

    4)  echo '你选择了 4'

    ;;

    *)  echo '你没有输入 1 到 4 之间的数字'

    ;; # ;;  如果没有匹配到数值自动结束

esac


----------------  break 终止后面的所有循环  -----------------

#!/bin/bash

while :

do

    echo -n "输入 1 到 5 之间的数字:"

    read x # 读取 x 变量

    case $x in # case 事例 变量x在下面中匹配正确后输出字符串和变量x的值


        1|2|3|4|5) echo "你输入的数字为 $x!"

        ;; # 到这里结束;因为没有匹配到数值


        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"

            break # 跳出循环

        ;;

    esac

done



------------------  continue  -------------

continue [kənˈtɪnjuː] 持续

# 仅仅跳出当前循环,不会跳出整个循环


#!/bin/bash

while :

do

    echo -n "输入 1 到 5 之间的数字: "

    read x # read [riːd] 读取 变量 x 的值

    case $x in # case  [keɪs] 事例,定义这个事件:变量x的值在下面去匹配

        1|2|3|4|5) echo "你输入的数字为 $x!"

;;

# 匹配成功则 响应一个字符串和变量 $x,

        # 否则就返回后面的字符串


        *) echo "你输入的数字不是 1 到 5 之间的!"

            continue # 结束子循环,继续停留在这里

            echo "游戏结束" # 这是测试的,看看会不会被整体结束

        ;;

    esac

done



函数

符号:

$# 传参个数    $* 传参内容    $$ 当前进程ID    $! 后台最后ID    $@ 换行显示传参内容

$- 显示选项与set相同    $? 退出状态0正常,其他有错误


#!/bin/bash

function xxx(){ # function [ˈfʌŋkʃn] 函数,功能

# 定义一个函数为 xxx

    echo "这是我的第一个 shell 函数!"

    return `expr 1 + 1`

# 这是函数的内容

# return  [rɪˈtɜːn] 返回一个值

# expr 简单计算标签函数

}


xxx # 启用xxx 函数

# 有两个,1字符串,2简单计算


echo $?+$- # 响应:  $? 退出状态,$- 显示选项

echo $-

# 可以存放多个函数,如 function a;   function b  等等



---------------------------  重点:函数命令  ------------------------


if echo "Hello World !" | grep -e Hello

# if 判断响应的字符串里面,grep 匹配 -e 存在: hello

then # then 然后

    echo true # 响应为 true

else # else 其他

    echo false

fi # 结束


------------------

return  返回值 0为真 turn,大于0为假false;

function a(){ # 定义函数,他的名字为a

    return 0 # 手动定义它的返回值为真 0

}


function b(){ # 函数 b

    return 3 # 大于了0 为假false

}


if a # 判断函数a 的返回值 是否为真 0 

then # 然后

    echo true # 响应

else

    echo false

fi


if b # 判断 函数b 是否为真 0 

then # 然后

    echo ture #相应 值

else

    echo false

fi



实例

------------------------  输入输出重定向  --------------------------

#!/bin/bash

for a in "小绿叶技术博客" "https://www.eisc.cn"

# 定义变量 a 为字符串

do

    echo $a>>1.txt  #将输入结果以追加的方式重定向到文件

# 将变量 a 重定向到文件

done

cat 1.txt #查看效果


-----------------

ls -l >1.txt # 将命令的结果重定向到文件



#!/bin/bash


echo "###############  文件备份  ################"

function touch(){


if test -e /etc/sysconfig/iptables111

                                        #  -e 判断文件存在

then

        echo '备份文件存在不会创建'

else

        cp -rf  /etc/sysconfig/iptables /etc/sysconfig/iptables111

        echo '文件不存在,已经为你创建备份文件,备份文件内容为:'

        cat /etc/sysconfig/iptables111

fi

}

touch

echo "#############  指定字符位置行号  ###############"


function sed(){

a=$(cat -n /etc/sysconfig/iptables |grep 22 |awk '{print $1}')     

# 给变量赋值

# 正则表达式:显示行号查看文件,grep 22匹配字符22的

# wak 按字段处理,打印第一例 


if [ ! $a ];                                            # 判断变量为空

then

        echo "信息没有找打行数"+$a+"不会对文件进行修改"

else

        echo "行数已经找到,第"+$a+"行"+"正在对文件进行修改"

fi

}

sed





shell 脚本添加防火墙端口

#!/bin/bash

####   先使用函数备份文件    ####

function touch(){                       # 定义一个函数,名字为 touch

if test -e /etc/sysconfig/iptables111                    

                                                #  test -e 判断文件存在

then                                            # 然后

        echo '备份文件存已经存在,不会被创建/etc/sysconfig/iptables111'    

                                                # 响应一个字符串

else                                    # 其他情况

        cp -rf  /etc/sysconfig/iptables /etc/sysconfig/iptables111

        echo '已经为你创建备份文件,备份文件内容为/etc/sysconfig/iptables111:'

        cat /etc/sysconfig/iptables111

                                                # 做出处理,自定义操作

fi                                              # if 如果(开始),fi 结束 

}

touch                                   # 函数名字放出来,才能被识别执行

echo "感谢使用本程序,开发商:小绿叶技术博客eisc.cn"

####   然后再操作文件    ####

#!/bin/bash

echo "初始化配置文件内容"               # echo 打印字符串到命令窗口界面

cat /dev/null > /etc/sysconfig/iptables

                                                        # 使用cat 查看将配置文件清空 null

cat /etc/sysconfig/iptables111 >  /etc/sysconfig/iptables

                                                        # 使用cat 从备份文件 iptables111 里面还原字符串

sed -i '/22/a\-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT' /etc/sysconfig/iptables

                                                        # sed -i 写入文件

                                                        # 先匹配22端口的行

                                                        # a\ 在它的后一行插入字符串

                                                        # 修改的是iptables 文件

cat /etc/sysconfig/iptables

echo "使用sed 方法已修改配置文件:"

service iptables restart              # 重启防火墙

service httpd restart                  # 重启 httpd 服务

echo "该脚本已实现可重复正常执行达到效果

防火墙已成功添加端口80,现在访问 apache

开发商:小绿叶技术博客 https://www.eisc.cn/index.php?c=read&id=10&page=1&cache=refresh

"

提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:shell 脚本基础大全

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息