shell脚本和linux命令_linux命令和shell命令 shell脚本 - CSDN
  • linux中利用shell脚本条件执行命令   在linux环境中,我们总会有一些命令需要经常用,例如经常跳转到某些目录下或者执行某些命令,输入一连串的命令是很烦的,此时我们可以预先写一些脚本然后根据我们的选择自动...

    linux中利用shell脚本条件执行命令

     

    在linux环境中,我们总会有一些命令需要经常用,例如经常跳转到某些目录下或者执行某些命令,输入一连串的命令是很烦的,此时我们可以预先写一些脚本然后根据我们的选择自动执行命令,那岂不是完美,本脚本就是为此而生的(以跳转不同的目录举例,当然也可以执行其他命令,这时候只需要类比写shell命令即可) 
    1、首先建一个shell脚本start.sh

    #!/bin/bash
    cd_dir_1="/export/songhongwei/code"
    cd_dir_2="/export/songhongwei/data"
    cd_dir_3="/export/songhongwei/soft"
    echo ""
    echo " 1: cd $cd_dir_1"
    echo " 2: cd $cd_dir_2"
    echo " 3: cd $cd_dir_3"
    echo ""
    read -p "Please input the choice:"  idx
    #if [[ -z "$idx"]];then
    #  echo "no choice,exit"
    if [[ '1' = "$idx" ]];then
      eval "cd $cd_dir_1"
    elif [[ '2' = "$idx" ]];then
      eval "cd $cd_dir_2"
    elif [[ '3' = "$idx" ]];then
      eval "cd $cd_dir_3"
    else
      echo "no choice,exit!"
    fi
    echo ""

    2、然后把该脚本放在某个目录下,例如本人放在了/export/songhongwei/soft/sh 
    3、编辑~/.profile文件把sh目录添加到环境变量即可

    PATH="$HOME/bin:$HOME/.local/bin:/export/songhongwei/soft/sh:$PATH"

    4、在shell或linux终端中可以在任何目录下直接访问该命令

    . start.sh 或 source start.sh

    这里写图片描述

    注: 
    (1)步骤4中,start.sh 前的 点 不能忘记,代表的是在当前bash环境下读取并执行FileName中的命令,否则会新开子进程执行FileName中的命令,此时cd无法再当前bash环境跳转。 
    source、sh、bash、./执行脚本的区别:http://blog.csdn.net/yun90/article/details/22667829 
    (2)添加sh目录到环境变量目的是一方面可以在任何目录下执行FileName中命令,另外可以在该sh目录下添加多个此类脚本。

    展开全文
  • Linux命令行与Shell脚本编程大全》全书共605页,从开始到现在两个多月 了,终于把它看完了. 总结 总的来讲书中大部分的内容对我来说相对简单。但是贵在系统化地学习Linux全部的知识,贵在历尽繁华之后,在这...

    《Linux命令行与Shell脚本编程大全》全书共605页,从开始到现在两个多月 了,终于把它看完了.

    总结

    总的来讲书中大部分的内容不算太难,适合Linux新手和对Linux有一定了解的童鞋。但是贵在系统化地学习Linux全部的知识。当然有一个实战的环境也很重要,我是做大数据开发的,每天都要与Linux打交道,另一位做Java Web的同事说看也看了,但是工作中基本上都用不到,感觉帮助不大。

    概述

    上学的时候一直想梦想着早点参加工作,参加工作以后经常后悔当初大把的时间没有好好看书。
    从毕业到现在刚好4年,还没有毕业就独自一人去深圳,工作加出差历尽深圳、广州、上海、北京、成都。工作从JavaWeb到大数据,学也了很多知识,很多技术,却从来没有静下心来好好看一本技术书,这次静下心来好好看看
    从来没有想过自己会看完这么厚的一杯技术书,虽然厚,但是是一页一页看完的,实在看不下去的时候就打开印象笔记把书中的内容一个字一个字地敲出来。书中90%的命令都敲一遍,晒下自己的印象笔记吧
    Linux命令行与Shell脚本编程大全读后感_01.png
    敲过的命令也上传github了
    Linux命令行与Shell脚本编程大全读后感_02.png
    Linux用了也快三年了,写Shell脚本也有一年了,之前的时候都是需要什么去网上查什么,
    然后用得多了,自然而然也就会了,
    有时候对一些命令或关键字觉得很重要,进入非常深入地了解,
    但是不管当时学得有多么详细,多么地深入,也抵不过时间的流逝,即使是那些经常使用的命令,但是这本书看完的时候有种打通任督二脉的感觉,之前使用Linux的时候不同的知识点都是相互独立的,系统学过以后不同的知识碎片之间就好像有了联系,联系越多,越不容易忘记。
    书中sed和awk命令比较难一些,偶尔出现的脚本看完之后有种荡气回肠的感觉,原来程序也可以这样实现。其他的大部分都会,只是太多的细节,互相之间的联系不知道。
    推荐可以读下,虽然是外国人写的,但是翻译过来一点都不生涩。
    下一步把自己的个人电脑整成Linux,再看下Unix内核

    展开全文
  • 一、基本 bash shell命令 创建文件 : touch 链接文件:符号链接:是一个实实在在的文件,两个通过符号链接在一起的文件,彼此的内容并不相同。使用ln -s命令。 硬链接:会创建独立的虚拟文件,其中包含了原始...

    一、基本 bash shell命令

    创建文件 : touch

    链接文件:符号链接:是一个实实在在的文件,两个通过符号链接在一起的文件,彼此的内容并不相同。使用ln -s命令。

    硬链接:会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但他们从根本上而言是同一个文件。原始文件必须事先存在,使用ln命令。

    查看文件类型 : file

    查看整个文件 : cat , more , less

    查看部分文件 : tail , head

     

    二、更多shell命令

    探查进程 : ps , 常用 ps -ef , ps -l

    实时监测进程 : top。第一部分显示系统的概况:第一行显示当前时间、系统运行时间、登录的用户数以及系统的平均负载(三个值代表最近1min、5min、15min)如果近15min内的平均负载都很高,说明系统可能有问题。

    第二行显示了进程概要信息:有多少进程处在运行、休眠、停止或是僵化状态

    下一行显示了CPU的概要信息。

    紧跟其后的两行说明了系统内存的状态。第一行是系统的物理内存:总共多少内存,当前用了多少,还有多少。后一行表示同样的信息,不过针对系统交换空间。

    最后一行显示当前运行中的进程纤细列表。

    PID:进程ID; USER:进程属主名字; PR:进程优先级; NI:进程的谦让值; VIRT:进程占用的虚拟内存总量; RES:进程占用物理内存总量; SHR:进程和其他进程共享的内存总量; S:进程的状态(D可中断休眠,R运行,S休眠,T跟踪或停止,Z僵化); %CPU:进程使用CPU时间比例; %MEM:进程使用的内存占用内存的比例; TIME+:自进程启动到目前位置的CPU时间总量; COMMAND:进程对应的命令行名称。

    结束进程 : kill , killall

    挂载存储媒体: mount

    移除存储媒体: umount

    查看所有已挂载的磁盘 : df

    显示特定目录的磁盘使用情况 : du

    排序数据 : sort

    搜索数据 : grep

    压缩数据 : bzip2(.bz2) , compress(.Z) , gzip(.gz) , zip(.zip) 。只能压缩单个文件或者某个目录中的文件,或者是能有通用符表示的多个文件。

    归档数据 : tar (将多个文件归档进单个文件)

     

    三、理解Shell

    进程列表 : 将命令列表包含在括号中 , 如 :( pwd ; ls ; cd /etc; pwd; cd ; pwd; ls)会创建一个子shell来执行命令。

    后台模式 : 在命令结尾加上字符 & ,如 sleep 3000 &

    协程 : 在后台生成一个子shell,并在这个shell中执行命令 ,如 : coproc my_job { slee 10; }。

    外部命令 : 也称为文件命令,存在于bash shell 之外的程序,当外部命令执行时,会创建一个子进程。

    内建命令 : 不需要使用子进程来执行,执行速度更快

    命名别名 : alias li='ls -li',仅在它所被定义的shell进程中才有效。可以将alias设置放在$HOME/.bashrc文件中,使其效果永久化。

     

    四、Linux环境变量

    全局变量

    查看全局变量: printenv 或者 env,查看某一个环境变量printenv ,如: printenv PATH,或者echo,如: echo $PATH. 设置全局变量时,可以先创建一个局部变量,然后再使用export将其导出为全局变量。如 : export my_variable. 子shell不能改变父shell中的全局变量,即使使用export命令。

    局部变量

    查看局部变量: set命令会显示为某个特定进程设置的所有环境变量,包括局部、全局和用户定义变量。

    设置用户变量: my_variable="Hello world",该变量在子shell中无效。数组变量mytest=(one two three four five),输出所有的值echo ${mytest[*]},输出单个值 echo ${mytest[2]},可以使用unset删除数组中的某个值,但是只会使该索引上的值为空。素组变量在shell脚本编程时并不常用,它的可移植性不好。

    删除环境变量 : unset my_variable。如果该变量是全局变量,且在子shell中删除了该变量,在父shell中该变量依然可用。

    设置PATH变量 : PATH=$PATH:/home/christine/Scripts 。 只能持续到退出或者重启系统。

    环境变量的定位 : 登录时作为默认登录shell的启动文件为/etc/profile, 作为非登录shell的交互式shell(如在命令行敲入bash时启动),它不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。 非交互式shell使用的BASH_ENV环境变量,它可以继承父shell导出过的变量,使用当前shell的局部变量和全局变量。

    环境变量持久化 : 在/etc/profile.d 目录中创建一个以.sh结尾的文件。把所有新的或者修改过的全局变量设置放在这个文件夹中。

     

    五、Linux文件权限

    /etc/passwd文件

    登录用户名: 用户密码: 用户账户UID(数字形式):用户帐号组ID(GID数字形式): 用户账户的文本描述(备注字段): 用户HOME目录的位置: 用户默认shell

    /etc/shadow文件 : 只有root用户可以访问。

    登录名: 加密后的密码: 自上次修改密码后过去的天数(自1970年1月1日开始): 多少天后才能修改密码: 多少天后必须更改密码: 密码过期前多少天提醒用户更改密码: 密码过期后多少天禁用用户账户: 用户账户被禁用的日期(自1970年1月1日到当天的天数): 预留字段

    添加新用户: useradd

    删除用户 : userdel

    修改用户 : usermod(修改用户账户字段,可以制定主要组以及附加组的所属关系), passwd(修改已有用户的密码), chpasswd(从文件中读取登录名密码对,并更新密码), chage(修改密码的过期日期), chfn(修改用户账户的备注信息), chsh(修改用户的默认登录shell)

    /etc/group文件 : 文件格式 : 组名: 组密码: GID: 属于改组的用户列表

    创建组 : groupadd         

    修改组 : groupmod

    文件权限 : 例 lrwxrwxrwx 1 root root 6 Oct 3 03:54 link_nusers -> nusers

    第一个字符代表了对象类型 : -代表文件, d代表目录, l代表链接, c代表字符型设备, b代表块设备, n代表网络设备。3组3字符编码分别代表了对象的属主、对象的属组、系统其他用户的权限,r可读,w可写,x可执行,其中-是0,x是1,w是2,r是4。文件的全权限值是666,目录是777.umask值是掩码值,需要从对象的全权限值中减去,即666-022=644。

    改变文件权限:

    chmod 760 myfiles或者 chmod [ugoa…] [+-=] [rwxXstugo…]

    u代表用户,g代表组,o代表其他,a代表上述所有。

    +表示在现有权限基础上增加权限,-表示在现有权限上移除权限,=表示将权限设置成后面的值

    X如果对象是目录或者它已有执行权限,赋予执行权限; s运行时重新设置UID或GID; t保留文件或目录; u将权限设置为属主一样; g将权限设置为跟属组一样; o将权限设置为跟其他用户一样。

    改变所属关系 : chown 改变文件的属主。 chgrp改变文件的默认属组。

    共享文件(某一个组内的所有用户):

    mkdir testdir ##创建共享目录

    chgrp shared testdir #改变目录所在组

    chmod g+s testdir #在属组的权限上增加运行时重新设置UID或者GID

    umask 002 #设置文件对属组可写

    cd testdir ; touch testfile #进入目录创建文件

     

    六、管理文件系统

    创建分区 : fdisk

    创建文件系统(格式化) : mkfs.vfat(格式化u盘,文件系统fat), mkfs.ext3(文件系统ext3)

     

    七、安装软件程序

    使用aptitude 管理软件包

    在命令行输入aptitude

    快速显示某个特定包的详细信息 aptitude show package_name

    得到特定软件包相关的所有文件的列表 dpkg -L pageage_name

    找到特定的软件包 aptitude search package_name

    安装软件包 aptitude install package_name

    更新软件 aptitude safe-upgrade

    卸载软件 aptitude purge package_name 或 aptitude remove package_name

    区别remove选项不删除数据和配置文件,purge会删除全部。

     

    八、构建基本脚本

    创建shell脚本文件

    格式一般为 : #! /bin/bash

    例 如:

    使用变量

    环境变量: 在变量名前加美元符($)来使用这些环境变量。

    用户变量: var1=10,用户变量可通过美元符引用,在shell脚本结束时会被删除掉。

    命令替换:将命令输出赋给变量:反引号字符(`)或者$()

    重定向输入和输出

    输出重定向 : >(写入文件) , >>(追加)

    输入重定向 : <(基本输入) , <<(内联输入重定向)

    管道(  |  )

    将一个命令的输出作为另外一个命令的输入,如 ls -l | more

    执行数学运算

    expr命令 : expr 1 \* 2 , expr 1 + 5

    使用放括号 : var1=$[1 + 5] var2=$[$var1 * 2]

    浮点: 使用bc计算器,设置小数位: scale=4

    在脚本中使用bc,基本格式:

    variable=$(echo “options; expression” | bc)

    bash计算器中创建的变量只能在bash计算器中有效,不能在shell脚本中使用

    退出脚本

    查看退出状态码 : $?(0表示默认正常退出)

    exit命令:允许在脚本结束时指定一个退出状态码,如 exit 5

     

    九、使用结构化命令

    if语句

    if语句会运行if后面的那个命令,如果该命令的退出状态码是0,then部分的命令会被执行,如果是其他值,then部分不会被执行

    基本格式 :

    if command1
    then 
        command
    fi

    if-then-else语句

    基本格式:

    if command
    
    then command
    
    else command
    
    fi


    或者 :

     if command
    
    then command
    
    elif command
    
    then command
    
    fi

    嵌套if

    test命令

    如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0.如果变量中没有内容,退出状态不为0.基本格式:

    test condition

    在if-then语句中的用法

    if test condition
    
    then commands
    
    fi

    另外一种方法 :

    if [ condition ] ####注意空格
    
    then command1
    
    fi

     

    数值比较和字符串比较

    #! /bin/sh
    ##数值比较
    # n1 -eq n2  检查n1是否与n2相等 (equal)
    # n1 -ge n2  检查n1是否大于或等于n2 (great equal)
    # n1 -gt n2  检查n1是否大于n2 (greater than)
    # n1 -le n2  检查n1是否小于或等于n2 (less equal)
    # n1 -lt n2  检查n1是否小于n2 (less than)
    # n1 -ne n2  检查n1是否不等于n2 (not equal)
    ##字符串比较
    # str1 = str2 检查str1是否与str2相同
    # str1 != str2 检查str1是否与str2不同
    # str1 < str2 检查str1是否比str2小
    # str1 > str2 检查str1是否比str2大
    # -n str1 检查str1的长度是否非0
    # -z str1 检查str1的长度是否为0
    value1=10
    value2=a
    if [ $value1 -gt 5 ]
    then 
    	echo "the test value $value1 is greater than 5"
    fi
    
    if [ $value1 \< $value2 ]  #注意这里需要转义
    then
    	echo "$value1 is less than $value2"
    else
    	echo "$value1 is greater than $value2"
    fi
    

     

    文件检查

    #! /bin/bash
    ##文件比较
    # -d file          检查file是否存在并是一个目录
    # -e file          检查file是否存在
    # -f file          检查file是否存在并是一个文件
    # -r file          检查file是否存在并可读
    # -s file          检查file是否存在并非空
    # -w file          检查file是否存在并可写
    # -x file          检查file是否存在并可执行
    # -O file          检查file是否存在并属当前用户所有
    # -G file          检查file是否存在并且默认组与当前用户相同
    # file1 -nt file2  检查file1是否比file2新
    # file1 -ot file2  检查file1是否比file2旧
    
    file=/root/Desktop/Scripts
    if [ -d $file ]
    then 
    	echo "this is a directory"
    fi
    

    复合条件测试

    [ condition1 ] && [ condition2 ]  ## 逻辑与
    
    [ condition1 ] || [ condition2 ]  ## 逻辑或

    if-then 高级特性

    用于数学表达式的双括号

    用于高级字符串处理功能的双方括号

    #!/bin/bash
    ##双括号命令符号
    # val++  后增,    val--  后减,    ++val  先增,    --val  先减
    # !  逻辑求反,    ~  位求反,      **  幂运算,    <<  位左移
    # >> 位右移,     &  位布尔和,    |  位布尔或,  && 逻辑和,  || 逻辑或
    
    ##双方括号   [[ expression ]] 
    #  expression使用test命令中采用的标准字符串比较,同时还提供了模式匹配
    
    var1=4
    var2=3
    ((var3=$var1 & $var2))
    if [ $var3=0 ]
    then 
    	echo "$var1 & $var2 is equal 0 "
    fi
    if [[ $USER == r* ]]
    then 
    	echo "Hello $USER"
    fi
    
    

    case命令

    在一组可能的值中寻找特定值(相当于switch)

    基本格式

    case variable in 
            pattern1 | patter2)    command1;;
            pattern3) command2;;
            *) default commands;;
    easc
    #!/bin/bash
    
    case $USER in
    	root | barbara)
    		echo "Welcome, $USER"
    		echo "Please enjou you visit";;
    	testing)
    		echo "Special testing account";;
    	*)
    		echo "sorry,you're not allowed here";;
    esac
    

    十、更多结构化命令

    for命令

    基本格式 :

    for var in list
    
    do
    
    commands
    
    done
    #! /bin/bash
    
    ##读取列表中的值
    # list="Alabama Alaska Arizona"
    ## 读取复杂值 
    # list="I don\'t know if this\'ll work"   #单引号转义
    ## 从变量读取列表
    # list="Alabama Alaska Arizona"
    # list=$list "Connecticut"   # list="Alabama Alaska Arizona Connecticut"
    ## 从命令读取值
    # list="/root/Desktop/Scripts/state"
    # for state in $(cat $list)
    ## 更改字段分割符
    # 默认分割符 : 空格、制表符、换行符
    # 更改IFS的值: IFS=$'\n',只能识别换行符
    ## 用通配符读取目录
    # for file in /root/Desktop/Scripts/*
    
    # example1:
    file=state
    IFS=$'\n'
    for state in $(cat $file)
    do 
    	echo "$state"
    done
    
    # example2:
    for (( a=1,b=10 ; a<=10 ; a++,b--))
    do 
    	echo "$a-$b"
    done
    

    C语言风格for命令

    格式 :

    for (( variable assignment ; condition ; iter))

    while命令

    它会在每次迭代的一开始测试test命令,在test命令返回非零退出状态码时,while命令会停止执行。格式 :

    while test_command
    
    do
    
    other commands
    
    done
    #!/bin/bash
    ## 在while中可以使用多个测试命令
    var1=10
    while echo $var1           ##第一个测试命令
           	   [ $var1 -ge 0 ] ##第二个测试命令
    do
    	echo "This is inside the loop"
    	var1=$[ $var1 - 1 ]
    done
    
    

    until命令

    和while命令工作方式完全相反,until命令要求你制定一个通常返回非零推出状态码的测试命令,只有测试命令的退出状态码不为0,才会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环结束。基本格式:

    until test_command
    
    do
    
    other commands
    
    done
    
    

    用法同while相同。

    其他知识:

    #! /bin/bash
    ## 循环文件处理
    IFS.OLD=$IFS ##保存IFS值
    IFS=$'\n'
    for entry in $(cat /etc/passwd)
    do
    	echo "Values in $entry -"
    	IFS=:
    	for value in $entry
    	do 
    		echo "    $value"
    	done
    done
    
    ## break n: 命令可以跳出内部和外部循环,n默认为1,表示跳出当前循环,如果将n设为2,break命令会停止下一级的外部循环
    ## continue n: 命令允许通过命令行参数指定要继续执行哪一级循环
    ## 处理循环输出: 可以对循环的输出使用管道或进行重定向,这可以通过在done命令后添加一个处理命令来实现
    
    for file in /root/Desktop/Scripts/*
    do 
    	if [ -f "$file" ]
    	then
    		echo "$file is a file"
    	fi
    done > output.txt
    # done | sort > output.txt
    

     

    展开全文
  • 十二、呈现数据 输入输出  标准文件描述符  0 STDIN 标准输入  1 STDOUT 标准输出  2 STDERR 标准错误  重定向错误  1.只重定向错误 ls -al badfile 2&gt;test1 ...

    十二、呈现数据

    输入和输出

        标准文件描述符

                     0 STDIN 标准输入

                     1 STDOUT 标准输出

                     2 STDERR 标准错误

        重定向错误

                      1.只重定向错误

     ls -al badfile 2>test1         ##2>表示只重定向错误

                      2.重定向错误和数据

    ls -al test test2 test3 badtest 2>test4 1>test5
    
    ### 2>表示将错误重定向到test4文件,1>表示将标准输出重定向到test5文件
    
    ls -al test test3 test4 badtest &> test7
    
    ### &>会将所有的输出发送到同一个文件,包括错误和数据
    
    


    在脚本中重定向输出

    1.临时重定向

    使用输出重定向符来讲输出信息重定向到STDERR文件描述符。在重定向到文件描述符时,必须在文件描述符数字前加一个&

    2. 永久重定向

    使用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符。

    ## 临时重定向,使用&
    echo "this is an error" >&2
    echo "this is normal output"
    
    ## 永久重定向,使用exec命令
    exec 2>testerror #重定向标准错误
    echo "this is the start of the script" ##正常在屏幕显示
    echo "now redirecting all output to another location" ##同上
    
    
    exec 1>testout ##重定向标准输出
    echo "this is a test should go to testout file" ##在testout文件中
    echo "this line should go to testerror file" >&2 ##在testerror文件中

    在脚本中重定向输入

    exec命令允许将STDIN重定向到Linux系统上的文件中。

    exec 0<test14_2.sh ##重定向输入
    count=1
    while read line
    do 
    echo "line #$count : $line"
    count=$[ $count + 1 ]
    done
    

    创建自己的重定向

    ## 1 创建输出文件描述符
    exec 3>testout
    echo "this should be stored in the file " >&3
    echo "this should be on the screen"
    ## 2 重定向文件描述符
    exec 3>&1  ##描述符3重定向为描述符1,即STDOUT
    exec 1>testout  ##STDOUT重定向到文件
    echo "this should store in the output file"
    echo "along with this line"
    exec 1>&3 ##STDOUT重定向到显示器
    echo "now things should be back to normal"
    ## 3 创建输入文件描述符
    exec 6<&0
    exec 0<test14_2.sh
    count=1
    while read line
    do
    	echo "line #$count : $line"
    	count=$[ $count + 1 ]
    done
    exec 0<&6
    read -p "Are you done now? [Y/N]: " answer
    case $answer in
    	Y|y) echo "Goodbye" ;;
    	N|n) echo "sorry,this is the end." ;;
    esac
    
    ## 4 文件读写描述符,需要特别小心使用,使用<>
    exec 3<>testfile
    read line <&3
    echo "read : $line"
    echo "this is a test line." >&3
    ## 5 关闭文件描述符,使用&-,一旦关闭,在脚本就不能在使用
    exec 3>&-
    

    列出打开文件描述符

     

    ## 列出打开的文件描述符 lsof命令
    ## lsof -a -p $$ -d 0,1,2,3,4,5,6,7,8,9
    exec 3>testfile1
    exec 5<testfile2
    exec 8<testfile
    /usr/bin/lsof -a -p $$ -d0,1,2,3,5,8
    

    阻止命令输出

    可以将STDERR重定向到一个叫做null文件的特殊文件,该文件位置为/dev/null

    ls -al >/dev/null

    创建临时文件

    mktemp testing.XXXXXX

    指定一个文件名模板,模板可以包含任意文本文件名,在文件名末尾加上6个X就可以了。mktemp命令会用6个字符替换这6个X,该文件在系统启动时不会被删除。-t选项会强制mktemp命令在系统的临时目录创建文件,使用这个选项,mktemp命令会返回临时文件的全路径,在/tmp目录中的文件会在系统启动时被删除。-d选项会创建一个临时目录

    ##创建临时文件
    # 本地临时文件 mktemp testing.XXXXXX,mktemp会用6个字符替换这6个X,保证文件名在目录中是唯一的
    # -t选项会强制mktemp命令在/tmp目录中创建文件,返回文件的全路径,该文件在系统启动时会被删除
    # -d选项会创建一个临时目录
    tempfile=$(mktemp test.XXXXXX)
    exec 3>$tempfile
    echo "This script writes to temp file $tempfile"
    echo "This is the first line" >&3
    echo "This is the second line" >&3
    echo "This is the thrid line" >&3
    exec 3>&-
    echo "Done creating temp file.The contents are:"
    cat $tempfile
    rm -f $tempfile 2> /dev/null
    

    记录消息

    tee命令可以将输出同时发送到显示器和日志文件,命令格式: tee filename,-a选项会将数据追加到文件中

    ## 记录消息
    # tee命令会将输出同时发送到显示器和日志文件,用法tee filename
    # 例如: date | tee -a testfile
    # -a选项会将数据追加到文件中
    

    十三、控制脚本

    处理信号

        1.Linux常用信号

                     信号                值                        描述

                     1               SIGHUP                挂起进程

                     2               SIGINT                  终止进程

                     3               SIGQUIT               停止进程

                     9               SIGKILL                无条件终止进程

                     15             SIGTERM             尽可能终止进程

                     17             SIGSTOP             无条件停止进程,但不是终止进程

                     18             SIGTSTP              停止或暂停进程,但不终止进程

                     19             SIGCONT             继续运行停止的进程

        2.生成信号: 中断进程 Ctrl+C 暂停进程 Ctrl+Z

    ##捕获信号 
    trap commands signals

    3.捕获脚本退出

    trap commands EXIT

    4.修改或移除捕获,如果一个信号在捕获被修改前接收到,脚本仍然会根据最初的trap命令进行处理。

    ## 使用trap捕获信号
    trap "echo 'sorry,I have trapped ctrl-c'" SIGINT
    count=1
    while [ $count -le 10 ]
    do
    	echo "Loop #$count"
    	sleep 1
    	count=$[ $count + 1 ]
    done
    # 修改捕获,捕获脚本退出
    trap "echo goodbye..." EXIT
    # 移除捕获
    trap -- SIGINT
    

    以后台模式运行脚本

        1.后台运行脚本,在命令后加上 & 符就可以了,终端会话推出,后台进程也会随之退出。

        2.在非控制台下运行脚本,使用nohup命令

    nohup ./test1.sh &

    作业控制

        1.查看作业: jobs ,带加号的作业会被当作默认作业,带减号的作业为下一个默认作业,任何时候只有一个带加号的作业和一个带减号的作业

        2.重启停止的作业 :

    后台模式重启: bg 加作业号

    前台模式重启: fg 加作业号

    调整谦让度

    调度优先级从-20(最高优先级)到+19(最低优先级),默认情况下,shell以优先级0启动所有进程

    1. nice命令让命令以更低的优先级运行,不能调高优先级:

    nice -n 10 ./test4.sh> test4.out &(或者可以直接去掉n)
    
    nice -10 ./test4.sh> test4.out &(直接去掉n)

    2. renice命令:改变系统上已经运行命令的优先级

    renice -n 10 -p 5055    ##(5055进程优先级调低到10)

    # 只能对属于你的进程执行renice

    # 只能通过renice降低进程的优先级

    # root用户可以通过renice来任意调整进程的优先级(可以调高优先级)

    定时运行作业

        1. at命令

        基本格式 at [-f filename] time

        时间格式: 标准的小时和分钟格式,如10:15

             AM/PM指示符,如10:15 PM

             特定可命名时间,如now,noon,midnight,teetime

             标准日期格式,如MMDDYY,MM/DD/YY或DD.MM.YY

             文本格式如Jul 4或Dec 25

             指定时间增量 当前时间+25min, 明天10:15pm,10:17+7天

        atq可以查看系统中有哪些作业在等待

        atrm可以删除等待中的作业

        2.需要定期执行的脚本

        -- cron时间表

        格式: min hour dayofmonth month dayofweek command1

        允许使用特定值、取值范围、或者通配符来指定条目。

       -- 构建cron时间表      crontab -l

       -- 浏览cron目录

        /etc/目录下有四个基本目录.hourly,daily,weekly,monthly,如果脚本需要每天运行一次,吧脚本复制到daily目录就可以了

       -- anacron程序

    某作业由于关机错过了执行时间,anacron会尽快运行该作业,只会处理位于cron目录,一般在/etc/anacrontab文件中

    格式 : period delay identifier command

    peroid定义作业多久运行一次,以天为单位,identifier条目是一种特别的非空字符串,用于唯一标识日志错误和错误邮件中的作业。command条目包含了run-parts程序和一个cron脚本目录名。

    使用新shell启动脚本

    用户登录会按照顺序查找如下文件,当找到顺序值低的文件时,不再继续查找:

    $HOME./bashrc,$HOME/.bash_profile,$HOME/.bash_login,$HOME/.profile

    展开全文
  • shell也是操作系统中的一个软件,他包含zailinux内核的外面,为了用户内核之间的交互提供了一个接口系统中的命令用shell去解释shell接收到系统回应的输出并显示其到屏幕上什么是shell脚本?脚本是一种解释型语言 #...

    什么是shell?

    shell也是操作系统中的一个软件,他包含zailinux内核的外面,为了用户和内核之间的交互提供了一个接口

    系统中的命令用shell去解释

    shell接收到系统回应的输出并显示其到屏幕上

    什么是shell脚本?

    脚本是一种解释型语言     ##命令需要解释器解释,运行效率慢

    用shell脚本保存执行动作

    用脚本判定命令的执行条件

    用脚本来实现动作的批量生产的执行



    1.diff 和path

    diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。 

    patch 命令用于打补丁,补丁文件是使用diff产生的, 

    patch 命令失败或拒绝接受补丁时,会产生一个和原文件同名,以”.rej”为后缀的差异文件。 

       当知道 -b 时,会产生一个和原文件同名,以”.orig”为后缀的备份文件。

    diff

    a是 add在增加

    d 是delete是删除

    c是change 改变

    [root@localhost mnt]# vim hehe

    [root@localhost mnt]# cat hehe

    xixixi

    linux

     

    [root@localhost mnt]# vim xixi

    [root@localhost mnt]# cat xixi

    hehehehe

    linux

    [root@localhost mnt]# diff xixi hehe   ##对比xixi 和 hehe文件

    1c1       

    < hehehehe    ##第一行改为hehehehe

    ---

    > xixixi

    2a3


    目录的比较

    root@localhost mnt]# mkdir westos

    [root@localhost mnt]# mkdir linux

    [root@localhost mnt]# touch westos/file1

    [root@localhost mnt]# diff westos linux -r

    Only in westos: file1   ##只有westos目录有file1文件



    path补丁

    diff -u hehe xixi (对比两个文件的不同,要把hehe文件变为xixi文件需要改变什么)


    [root@localhost mnt]# cat hehe

    hehe

    linux

    [root@localhost mnt]# cat xixi

    xixi

    linux

    [root@localhost mnt]# diff -u hehe xixi > hehe.path  (生成path补丁)

    [root@localhost mnt]# ls

    [root@localhost mnt]# patch hehe hehe.path  (将补丁hehe的补丁起名为hehe。path)



    [root@localhost mnt]# cat hehe


    [root@localhost mnt]# cat xixi


    备份文件

    [root@localhost mnt]# vim hehe

    [root@localhost mnt]# cat hehe

    hehe

    linux

    [root@localhost mnt]# cat xixi

    xixi

    linux

    [root@localhost mnt]# patch -b hehe hehe.path (运行shell时保存文件到hehe。orig)


    [root@localhost mnt]# ls

    heh  hehe  hehe.orig  hehe.path  xixi

    [root@localhost mnt]# cat hehe

    [root@localhost mnt]# cat xixi

    root@localhost mnt]# cat hehe.orig



    2.sort和uniq

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

    sort -n ##纯数字排序(按大小排序)


    sort -r ##倒叙


    sort -u ##去掉重复数字


    sort -o ##出处到指定文件

    sort -t ##指定分隔符

    sort -k ##指定要排列的序

    sort -nu file  (倒叙并去掉重复数字)


    sort -nr file (倒叙并且按照纯数字排列)


    [root@localhost mnt]# sort -t :  -n file (两列都按照纯数字排列)


    [root@localhost mnt]# sort -t :  -k 2 file (指定第二列)



     uniq

    uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用

    uniq 

    对重复字符作相应的处理 

    uniq -u ##显示唯一的行 

    uniq -d ##显示重复的行 

    uniq -c ##每行显示一次并统计重复次数


    root@localhost mnt]# cat file

    1

    2

    2

    3

    4

    5

    5

    11

    11

    23

    26

    1

    4

    3


    [root@localhost mnt]# sort -n file | uniq

     

    [root@localhost mnt]# sort -n file | uniq  -u (显示不重复的数字)


    [root@localhost mnt]# sort -n file | uniq  -c (重复数字)


    [root@localhost mnt]# sort -n file | uniq  -d  (显示重复数字)



    3.test命令

    -eq 是等于

    -ge 大于等于

    -gt 大于

    -le 小于等于

    -lt 小于

    -ne 不等于

    -ef 两个的链接相同

    -nt file1建立时间新与file2

    -ot file1建立时间旧与file2


    root@localhost mnt]# sh ip_check.sh 9

    yes

    [root@localhost mnt]# sh ip_check.sh 10

    no

    [root@localhost mnt]# vim ip_check.sh

    [root@localhost mnt]# sh ip_check.sh

    give me five !!


    [root@localhost mnt]# sh ip_check.sh 15

    no

     

    cat  ip_check.sh

    #!/bin/bash

    [ -z "$1" ] && {                 ##当输入为0的时候,输出 give me five ! !

    echo give me five !!    ## exit 1 退出

    exit 1

    }

    [ "10" -gt "$1" -a "$1" -gt "0"  ]   && {       ##当10 大于这个数时且这个数大于0时

    echo  "yes"                      ## 输出yes

    } ||{

    echo  "no"                      ##否则输出no

    }




    软链接:

    [root@localhost mnt]# touch file

    [root@localhost mnt]# ln /mnt/file /mnt/file1 (用file软链接file1)

    [root@localhost mnt]# ls

    check_file.sh  file  file1  ip_check.sh

    [root@localhost mnt]# ls -l

    total 8

    -rw-r--r-- 1 root root 246 Jun 10 02:09 check_file.sh

    -rw-r--r-- 2 root root   0 Jun 10 02:56 file

    -rw-r--r-- 2 root root   0 Jun 10 02:56 file1

    -rw-r--r-- 1 root root 316 Jun 10 02:43 ip_check.sh

    [root@localhost mnt]# ls -li *

    8842418 -rw-r--r-- 1 root root 246 Jun 10 02:09 check_file.sh

    8842417 -rw-r--r-- 2 root root   0 Jun 10 02:56 file

    8842417 -rw-r--r-- 2 root root   0 Jun 10 02:56 file1

    8842424 -rw-r--r-- 1 root root 316 Jun 10 02:43 ip_check.sh

    [root@localhost mnt]# [ "/mnt/file" -ef "/mnt/file1" ]&& echo yes || echo no ( /mnt/file 是否和 /mnt/file1 是链接关系,如果是输出yes ,如果不是,输出no)

    yes

    [root@localhost mnt]# [ "/mnt/file" -ef "/etc/passwd" ]&& echo yes || echo no (/mnt/file 是否和 /etc/passwd是链接关系,如果是输出yes ,如果不是,输出no)

    no

     

    [root@localhost mnt]# vim file.sh


    [root@localhost mnt]# sh file.sh  -e (file文件是否存在)

    yes

    [root@localhost mnt]# sh file.sh  -f  (file文件是不是不同文件)

    yes

    [root@localhost mnt]# sh file.sh  -L  (file文件是不是软链接)

    no

    [root@localhost mnt]# sh file.sh  -S  (file文件套接字)

    no

    [root@localhost mnt]# sh file.sh  -b  (file文件是不是快设备)

    no

    [root@localhost mnt]# sh file.sh  -d   (file文件是不是目录)

    no

    [root@localhost mnt]# sh file.sh  -c   (file文件是不是关键字)

    no



    展开全文
  • Linux中编写Shell脚本

    2020-02-04 17:02:12
    Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[]符号的运算示例 Shell脚本的条件测试 几种...
  • 这里写自定义目录标题功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容...一、Linux命令 1. | :管道,将前者命令...
  • 1 使用if then 语句和命令头,以及 输出 变量,复杂查询的方法 #!/bin/bash if date then echo 'itworks' fi echo 'common must output' if data2 then echo 'it is data2' fi echo 'common must output 2' ...
  • linux环境中,我们总会有一些命令需要经常用,例如经常跳转到某些目录下或者执行某些命令,输入一连串的命令是很烦的,此时我们可以预先写一些脚本然后根据我们的选择自动执行命令,那岂不是完美,本脚本就是为此...
  • shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 shell是一个命令语言解释器,它拥有自己...
  • 一、什么是shell答: shell翻译成壳的意思,它是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机界面。 shell可以通过其条件语句循环语句等,把一系列linu...
  • LinuxShell脚本的执行(三种方法)
  • 有时候,我们需要在shell脚本中获取执行命令得到的结果。如果只是想知道命令是否正确执行,可以用"$?"标识,如果是想要获得命令执行的结果,可以使用`comand`或者"$(command)"或者$(command) ...
  • Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码代码如下: cd /data/shell ./hello.sh ./的意思...
  • 脚本的编写 这里写代码片
  • 执行linux命令,将执行命令返回的值,赋给shell中的变量 第一种 data=`command` 第二种 data=$(command)其他 开头必须以 #!/bin/sh 开头 #![Args],Args表示执行该文件的程序 chmod +x filename,使可通过 ./...
  • 1. shell 基本语法 shell: ...什么是 shell脚本: 把 Linux 命令或语句放在一个文件中,通过这个程序文件去执行,这个程序为 shell 脚本或 shell 程序;可以在脚本中输入系统的命令以及相关的...
  • echo "start dump meminfo" ... 向文件末尾追加命令 #adb shell dumpsys meminfo >> ./shell.log adb shell cat /proc/meminfo >> ./shell.log i=$(( $i + 1 )) time=$(date "+%Y-%m-%...
  • Java可以通过Runtime.getRuntime().exec()方法调用linux平台下的命令Shell脚本。获取命令执行结果通常有两种,一种是waitfor方法,另一种是exitValue。但waitfor方法可能造成阻塞,原因如下:当调用exec方法后,...
  • shell脚本中获取命令执行返回值需要注意的地方
1 2 3 4 5 ... 20
收藏数 211,001
精华内容 84,400
关键字:

shell脚本和linux命令