• Shell学习笔记


    都是一些零碎的知识,遇到什么写什么吧!

    1、shell脚本参数

    C用(int *argc, char *argv[])处理参数,python sys.argv[0](脚本名字)、sys.argv[1]、sys.argv[2]等表示各个参数,shell脚本自己处理命令参数的方式如下:

    (1) $# 传递到脚本的参数个数,不包括脚本命令本身。如判断参数是否是2个:

       #!/bin/bash
       if [ $# != 2 ]; then                                                                                                                   
           echo "Error! should need 2 parameters!"
           exit 1
       fi

    (2) $0 脚本名字;$1,$2,......依次表示第一个参数,第二个参数,。。。。。。

    (3) $* 以一个单字符串显示所有向脚本传递的参数,此选参数可超过9个。如:

    若脚本参数为./test.sh arg1 arg2,
    则执行echo  $*,
    结果为:"arg1 arg2"
    
    
    

    (4) $$ 脚本运行的当前进程ID号。

    (5) $! 后台运行的最后一个进程的进程ID号。

    (6) $@  与$*相同,但是使用时加引号,并在引号中返回每个参数。如:

    若脚本参数为./test.sh arg1 arg2,
    则执行echo  $*,
    结果为:"arg1""arg2"  与#*的差别,每个参数都是一个单独的字符串。

    (7) $-  显示shell使用的当前选项,与set命令功能相同。(搞不懂)

    (8) $?  显示最后命令的退出状态。 0表示没有错误,其他任何值表明有错误。如:

    ls ./
    echo $?
    $?为0表示ls命令执行成功。

    2、管道与重定向

    管道操作符”|“,输出左边命令传出的正确输出信息,对与stderr信息没有直接处理能力。然后,传递给右边的命令,作为stdin。

    要求:

    (1) 管道命令只处理前一个命令正确输出,不处理错误输出;

    (2) 管道命令右边命令,必须能够接收标准输入流命令才行。如cat test.txt | ls ,ls不支持stdin,左边的数据将被丢弃。

    $ cat display.sh | ls
    call.py     libtest3.so  libtest.so    send_mail_text.py  test3.cpp  test4.cpp
    display.sh  libtest4.so  printfile.sh  test2.cpp          test3.so   test.c

    重定向:

    左边命令应该有标准输出  > 或者>>   右边只能是文件

    左边命令应该有标准输入  < 或者<<   右边只能是文件

            管道是触发了两个子进程执行"|"两边的程序,而重定向是在一个进程内执行。


    3、shell与export
    首先要知道用户登录linux系统之后,系统会启动一个用户shell。在该shell下执行shell脚本,会创建一个子shell,子shell可以共享父shell的环境变量,父shell却不能共享定义在子shell中的环境变量。子shell中定义的环境变量只在该子shell中有效。

    在shell中执行程序时,shell会提供一组环境变量,export可新增、修改和删除环境变量,供后续执行的程序使用。export设置的变量效用只在该次登录中有效。

    语法:export   [-fnp]   [变量名称]=[变量设置值]

    参数:

    -f代表[变量名称中为]函数名称。

    -n删除指定变量,实际上并未删除,只是不会输出到后续指令的执行环境中。

    -p列出所有shell赋予程序的环境变量,默认参数。
    如:

    Test@ubuntu:~/code$ export   //等同 export -p
    declare -x HOME="/home/Test"
    declare -x LANG="zh_CN.UTF-8"
    declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
    declare -x LC_ADDRESS="zh_CN.UTF-8"
    /*中间省略*/
    declare -x TERM="linux"
    declare -x USER="Test"
    declare -x XDG_RUNTIME_DIR="/run/user/1000"
    declare -x XDG_SESSION_ID="1"
    </pre><pre name="code" class="plain">Test@ubuntu:~/code$ export mytest="Hi"
    <pre name="code" class="plain">Test@ubuntu:~/code$ export 
    declare -x HOME="/home/Test"
    declare -x LANG="zh_CN.UTF-8"
    declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
    declare -x LC_ADDRESS="zh_CN.UTF-8"
    /*中间省略*/
    declare -x TERM="linux"
    declare -x USER="Test"
    declare -x XDG_RUNTIME_DIR="/run/user/1000"
    declare -x XDG_SESSION_ID="1"
    declare -x mytest="Hi"
    
    
    
    
    
    Test@ubuntu:~/code$ export -n mytest
    Test@ubuntu:~/code$ export 
    declare -x HOME="/home/Test"
    declare -x LANG="zh_CN.UTF-8"
    declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
    declare -x LC_ADDRESS="zh_CN.UTF-8"
    /*中间省略*/
    declare -x TERM="linux"
    declare -x USER="Test"
    declare -x XDG_RUNTIME_DIR="/run/user/1000"
    declare -x XDG_SESSION_ID="1"


    因为export添加的环境变量是临时有效,要想永久有效就得添加到文件中:

    (1)在/etc/profile文件中添加变量,对所有用户永久有效。例如:
    #vi    /etc/profile
    export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
    export PATH="$PATH:/home/Test"    //在原PATH变量上添加数据
    <span style="font-family: Arial, Helvetica, sans-serif;">注:修改文件后要想马上生效还要运行source /etc/profile,不然只能在下次重进此用户时生效。</span>
    
     (2)在用户目录下的.bash_profile(该文件在不同的linux系统下,文件名不同,有的是.profile,基本以profile结尾,可以用man bash查询)文件中添加环境变量,对该用户永久有效。用法跟上面相同。
     
    关于source,用法为:source  FileName,作用是在当前bash环境下读取并执行FileName中的命令,该FileName可以没有执行权限。注意该命令中的脚本是在当前bash环境下执行,没有产生子shell,所以脚本添加的变量也能被当前shell所共享,跟直接执行脚本产生子shell不太一样。如同样的脚本Test.sh:
    #!/bin/bash
         export mytest="Hi"
     用source Test.sh方式执行,mytest环境变量就可以添加到当前shell环境中,./Test.sh方式直接执行则不能。
    另外,source命令常用“.”来代替。source Test.sh与 .  Test.sh等效。






  • 相关阅读:
    mysql 存储过程实例
    国际会议查询方式和相关会议
    用 WEKA 进行数据挖掘,第 1 部分: 简介和回归(转)
    java实现甘特图的2种方法:SwiftGantt和Jfree (转)
    通过jxl 读取excel 文件中的日期,并计算时间间隔
    R 操作矩阵和计算SVD的基本操作记录
    SVD java 算法实现
    聚类方法简介
    Kolmogorov-Smirnov检验
    Java Thread 多线程 介绍
  • 原文地址:https://www.cnblogs.com/Harry-Lord/p/4002841.html
Copyright © 2020-2023  润新知