暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

shell从命令到脚本

数据与共享 2023-05-04
281

什么是shell

       shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 
       shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。 

       Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/linux 操作系统的核心。

常用指令学习:

1.查看指令的帮忙信息:man

    查看ls帮助信息:man ls
    查看tar的帮助信息:man ls

    2.目录层级跳转:cd

      下层目录:cd  directory_name
      返回上级:cd ..
      转到上次工作目录:cd -
      更改目录:cd /one/two  可以是相对路径也可是绝对路径。
      3.显示目录文件:ls
        显示文件名:ls
        显示文件详情:ll

        4.查看文件,每次一屏:more

          打开文件:more file.txt
          目录分屏查看:ls -l |more
          文本中搜索某字符:打开文件more myfile.txt -> 输入:/string  【回车】 -> 输如n查看下一个

          5.连接或者显示文件:cat

            显示文件(文件行数大于屏幕行数,部分行内容滚出屏幕,无法查看):cat file.txt
            合并文件:cat file1 file2 > fileAll
            将一个文件内容追加到另一个文件:cat file1 >> file2

            6.更新文件的访问时间,如果没有则创建新的文件:touch

              touch files.txt
              7.创建一个或多个目录:mkdir
                mkdir directory_files
                mkdir -p /fodler1/fodler2

                8.复制文件:cp

                  当前目录创建file1的副本:cp file1.txt  file2.txt
                  将当前目录下的文件拷贝到其他目录:cp file1.txt   /one/tow
                  说明:如果副本已存在会被新的覆盖掉,如果是文件夹加-r

                  9.服务器之间传输文件:scp

                    从目标服务器取文件:scp -r root@10.56.189.55:/root/test1  /root/test2/

                    10.移动文件、重命名:mv

                      重命名:mv  file.txt file2.txt  
                      移动:mv file.txt  /tow/one

                      11.删除文件或目录:rm

                        确认是否删除文件:rm file1.txt
                        确认是否删除文件夹:rm -r fodlers
                        强制删除:rm -rf file.txt

                        12.在文件中搜索:grep

                          显示文本中第一个字符为字母的所有行:grep "^[a-zA-Z]" files.txt | more
                          显示文本中与 “tom” “jerry”匹配的所有行:grep -E "tom|jerry" files.txt |more
                          显示所有与模式不匹配的行:grep -v "^#" files.txt

                          13.显示进程的当前状态:ps

                            ps -ef | grep tomcat
                            ps -aux | grep tomcat

                            14.显示文件的最后几行:tail

                              tail files.txt
                              tail -20 files.txt
                              tail -n 20 files.txt
                              tail -fn 200 files.txt

                              15.显示文本的前n行:head

                                head -10 file.txt
                                head -n 10 file.txt

                                16.用匹配表达式查找文件:find

                                  查询以.profile命名的所有文件的完整路径
                                  find / -name .profile -print
                                  查询目录中包含某一字段的所有文件,并打印:find  -name '*select*' -print 
                                  找到后缀为.txt的文件并删除:find /one/two -name '*.txt'  -exec rm {} \;

                                  17.显示工作目录的路径:pwd

                                    输入:pwd
                                    结果:/user/profile/tom

                                    18.文件压缩归档:tar gzip compress

                                      tar: 
                                      归档:tar -cvf aa.tar aadir
                                      释放:tar -xvf aa.tar
                                      压缩:tar-zcvf test.tar.gz test
                                      解压:tar -zxvf test.tar.gz
                                      gzip
                                      gzip files.txt
                                      结果:files.txt.gz
                                      解压文件:gunzip files.txt
                                      compress
                                      压缩:compress files.txt   
                                      结果:files.txt.z
                                      解压缩:uncompress files.txt

                                      19.杀死进程:kill

                                        kill -9 382382
                                        kill -9 382382 382383

                                        20.比较文本的不同:diff

                                          diff file1.txt file2.txt 
                                          比较文本不同,忽略空格:diff -w file1.txt file2.txt 

                                          21.更改文件模式:chmod

                                            文件改为可写:chmod  +w file.xt
                                            文件改为制度:chmod +o file.txt
                                            将所有权限赋予该文件夹:chmod -R 777 /update/

                                            22.查看用户组和用户

                                              cat etc/passwd
                                              cat etc/group
                                              创建用户组:groupadd -g 550 groupName
                                              创建用户:useradd -m -g groupName userName
                                              23.更改文件的所有者或组:chown
                                                改变文件file.txt 的所有者:chown dug file.txt
                                                将目录/one/tow 下的所有用户的所有者改为tom 组改为jerry:chown -R  tom:jerry /one/two

                                                24.流编辑器:sed

                                                  显示包含tom的行:sed "/tom/p" files.txt
                                                  对file1.txt中的good全部替换成$bad后复制到file2.txt:cat file1.txt | sed -e "s/good/$bad/g" > file2.txt
                                                  25.文件排序:sort
                                                    当前目录文件大小排序:  du -sh *|sort -h
                                                    25.定时任务:/etc/crontab
                                                      注意:不要执行不带任何参数的crontab命令,这会清空已经配置好的所有定时执行的任务。
                                                      通过编辑/etc/crontab文件来添加定时任务。
                                                      26.消息输出,可以是变量:echo
                                                        定义变量:i=100
                                                        echo ${i}  # 输出:100
                                                        echo "开始执行脚本\c"   ## 输出不换行
                                                        27.分割文件:cut
                                                          截取第3位和第5位:echo "abcdefg" |cut -c 3,5
                                                          结果:ce
                                                          截取3-5位的字符:echo "abcdefg" | cut -c 3-5
                                                          结果:cde

                                                          28.求表达式变量的值:expr

                                                            修改shell变量:count ='expr $count+1'
                                                            查看shell变量的长度:expr length $shell
                                                            输入:count=100
                                                            输入:count=`expr $count + 1`
                                                            输入:echo ${count}  # 输出为:101
                                                            输入:expr length $count    # 输出为:3

                                                            29.查找匹配行并对其进行操作:awk

                                                              显示长度大于10个字符的行:awk 'length>10' files.txt
                                                              30.定义别名:alias
                                                                alias  show='ls -l'
                                                                输入:show   # 展示文件列表详

                                                                31.更改文件或目录的所有权:chgrp

                                                                  将文件所有组改为root:chgrp root file.txt 
                                                                  将目录下所有文件所有组改为root:chgrp root file.txt 
                                                                  32.变量2次解析:eval
                                                                    a=2
                                                                    eval echo $a        # 输出:2
                                                                    test.txt 文档中输入:hello world!
                                                                    x="cat test.txt"
                                                                    eval $x              # 输出结果为:hello world!

                                                                    33.其他常见命令

                                                                      date          #  2023年 04月 22日 星期六 21:55:31 CST
                                                                      who      #  名称   线路   时间  空闲  进程号  备注
                                                                      basename  #  basename -s .txt test.txt 输出为:test。用于打印目录或者文件的基本名称 
                                                                      dirname       #  输入:dirname root/update/test/ 输出:/root/update
                                                                      uname         #  输入:uname。输出:Linux
                                                                      uptime        #  用于显示系统总共运行了多长时间和系统的平均负载。输出:22:23:43 up 715 days, 51 min, 3 users, load average: 0.03, 0.02, 0.05

                                                                      34.重定向:>  >> <  <<

                                                                        >   ls > test.txt          #  将ls的插叙询结果写入test.txt文件
                                                                        >>  echo "end" > test.txt  #  追加到文件末尾
                                                                        cat /dev/null > a. txt     #   清空一个文件,/dev/null是linux的黑洞

                                                                        35.管道符:|

                                                                           cat test.txt | sort            #  排序
                                                                           cat test.txt | sort | uniq     #  排序去重
                                                                           cat test.txt | grep 'good'     #  过滤筛选

                                                                          36.命令组合工具:xargs

                                                                            cat test.txt | xargs                      # 一行显示
                                                                            cat test.txt | xargs -n3 # 每行显示3个字符,不包括空格
                                                                            echo nameXnameXnameXname | xargs -dX      #  输出:name name name name
                                                                            cat arg.txt | xargs -I {} echo {}         #  文本内容按行打印
                                                                            find . -type f -name "*.txt" -print | xargs tar -zcvf test1.tar.gz   # 将当前文件下的所有.txt文件归档


                                                                            shell的一些标识:

                                                                            1.文件状态

                                                                              -d  目录       
                                                                              -s 文件长度大于0
                                                                              -f 正规文件
                                                                              -w 可写
                                                                              -L 符号链接
                                                                              -u 文件有suid的设置
                                                                              -r 可读
                                                                              -x    可执行
                                                                              2.逻辑操作符
                                                                                -a   逻辑与
                                                                                -o 逻辑或
                                                                                !逻辑非
                                                                                3.字符串比较
                                                                                  =    相等
                                                                                  != 不等
                                                                                  -z 空串
                                                                                  -n   非空串

                                                                                  4.数值比较

                                                                                    -eq   相等
                                                                                    -ne   不等
                                                                                    -gt   第一个数大于第二个
                                                                                    -lt   第一个书小于第二个
                                                                                    -le   第一个小于等于第二个
                                                                                    -ge 第一个数大于等于第二个

                                                                                    shell的函数

                                                                                    1.判断返回值的真假:if

                                                                                      if  条件1
                                                                                           then 命令1
                                                                                      elif 条件2
                                                                                           then 命令2
                                                                                      else      命令3
                                                                                      fi

                                                                                      举例:输入一个数判断其是偶数还是奇数

                                                                                        #!/bin/sh
                                                                                        echo "please input a number:\C"
                                                                                        read num
                                                                                        if (($num%2==0))
                                                                                        then
                                                                                        echo $num "是偶数"
                                                                                        else
                                                                                        echo $num "是奇数"
                                                                                        fi
                                                                                        2.多选择语句:case
                                                                                          case $num in
                                                                                            内容1)
                                                                                                命令1;;
                                                                                           内容2)
                                                                                                命令2;;
                                                                                          esac

                                                                                          举例:判断输入的值属于那个集合

                                                                                            #!/bin/sh
                                                                                            echo "please input like a b c d e f g:\C"
                                                                                            read ms
                                                                                            case $ms
                                                                                            in a|b|c|d)
                                                                                            echo $ms "属于abcd";;
                                                                                            e|f|g)
                                                                                            echo $ms "属于dfg";;
                                                                                            *) echo "不在集合之内"
                                                                                            exit 1;;
                                                                                            esac

                                                                                            3.循环:for

                                                                                              #  输出1-10数字
                                                                                              for((i=1;i<=10;i++));
                                                                                              do
                                                                                              echo $(expr $i);
                                                                                              done


                                                                                              #  循环中嵌套if判断
                                                                                              for((i=1;i<=10;i++));
                                                                                              do
                                                                                              echo $(expr $i);
                                                                                              if(($i%2==0))
                                                                                              then
                                                                                              echo $i "是偶数"
                                                                                              else
                                                                                              echo $i "是奇数"
                                                                                              fi
                                                                                              done

                                                                                              4.循环:until

                                                                                                # num 大于10时停止循环
                                                                                                num=0;
                                                                                                until ((num>10))
                                                                                                do
                                                                                                ((num++))
                                                                                                echo $num
                                                                                                done
                                                                                                echo $num

                                                                                                5.循环:while

                                                                                                  # /bin/sh
                                                                                                  num=0;
                                                                                                  while ((num<10))
                                                                                                  do
                                                                                                  ((num++))
                                                                                                  echo $num
                                                                                                  done
                                                                                                  echo $num

                                                                                                  6.结束本次循环:continue,跳出整个循环:break

                                                                                                    #  跳出整个循环
                                                                                                    # /bin/sh
                                                                                                    num=0
                                                                                                    for ((i=0;i<100;i++))
                                                                                                    do
                                                                                                    ((num += i))
                                                                                                    if(($num>100))
                                                                                                    then
                                                                                                    echo "$num 大于100,跳出整个循环"
                                                                                                    break
                                                                                                    else
                                                                                                    echo "$num 小于100"
                                                                                                    fi
                                                                                                    done

                                                                                                    文章转载自数据与共享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                                    评论