linux学习笔记一

来源:互联网 发布:淘宝宽屏图片 编辑:程序博客网 时间:2024/05/22 18:16
1、查看linux下系统默认的shell,echao $SHELL,注意是大写的SHELL
2、将vim别名成vi步骤:
    root@anLA7856:/var/log# echo "alias vi='vim'">>/etc/profile
    root@anLA7856:/var/log# tail -1 /etc/profile
    alias vi='vim'
    root@anLA7856:/var/log# source /etc/profile
3、查看第一行:
    root@anLA7856:/var/log# head -1 /etc/profile
4、检测系统是否存在漏洞:
    root@anLA7856:/etc# env x='() { :;}; echo be careful' bash -c "echo this is a test"
如果没问题,就会输出:
this is a test
否则会输出:
be careful
this is a test

5、通过source或“.”加载过的脚本,由于是在当前shell中执行脚本,因此在脚本结束之后,脚本中的变量包括函数在当前shell中依然存在。
   而通过sh或bash执行的脚本都会启动新的子shell执行,执行玩后回退到父shell,因此变量等是无法保留的。
    例如下面注意echo $user返回的会是啥:
    root@anLA7856:/home/anla7856/shell# echo "user=`whoami`" >> whoami.sh
    root@anLA7856:/home/anla7856/shell# ls
    whoami.sh
    root@anLA7856:/home/anla7856/shell# sh whoami.sh
    root@anLA7856:/home/anla7856/shell# echo $user

    root@anLA7856:/home/anla7856/shell#

6、对于常规变量的字符串定义变量应加双引号,并且等号前后不能有空格,需要强引用的(指所见即所得的字符引用),
   则用单引号(''),如果是命令的引用,则用反引号(``).


7、linux中变量类型有两种:环境变量和普通变量(区分大小写)。
    按照规范,所有环境变量均采用大写形式,将环境变量应用于进程程序之前,都应该用export命令导出定义
    例如:配置Java的环境变量
        JAVA_HOME=/usr/java/jdk1.8
        CLASSPATH=$JAVA_HOME/lib/
        PATH=$PATH:$JAVA_HOME/bin
        export PATH JAVA_HOME CLASSPATH

8、关于set、env、declare的输出:
    set:输出所有变量,包括全局变量和局部变量
    env:只显示全局变量
    declare:输出所有的变量、函数、整数和已经导出的变量

9、定义环境变量并赋值的方法:
    #export NAME=anla7856
    #declare -x NAME=anla7856
    #NAME=anla7856; export NAME

10、常见的全局变量的配置文件(我的是ubuntu 16)
    root@anLA7856:/etc# vim profile.d
    root@anLA7856:/etc# vim bash.bashrc
    root@anLA7856:/etc# vim profile  (我主要在这里面配置各种环境变量)

11、可以用unset来消除本地变量和环境变量
    root@anLA7856:/etc# echo $NAME
    anla7856
    root@anLA7856:/etc# unset NAME
    root@anLA7856:/etc# echo $NAME

    root@anLA7856:/etc#

12、linux下环境初始化与对应文件生效顺序
    首先,系统运行shell的方式一般有3种:
    1)通过系统用户登录后默认运行的shell
    2)非登录交互式运行shell
    3)执行脚本运行非交互式shell
   第一种方式时,用户登录linux系统,首先会加载/etc/profile全局变量文件,系统上每个用户登录都会加载这个。当加载玩/etc/profile文件后,
   才会执行/etc/profile.d目录下的脚本文件,这个文件下脚本文件有很多,例如系统的字符集设置(/etc/sysconfig/i18n)。之后,开始运行
   $HOME/.bash_profile(用户环境变量文件),在这里面,又会去找$HOME/.bashrc或者/etc/bashrc等环境变量文件,如果有就运行。
   第二种方式时,则只会加载$HOME/.bashrc-->/etc/bashrc,这样就需要将JAVA环境变量等放入$HOME/.bashrc中而不是/etc/profile

13、普通变量定义:
    NAME=anla7856
    NAME='anla7856'
    NAME="anla7856"
    输出方式可以为:
    echo $NAME  或者
    echo ${NAME}
    同样:
    echo `date` 等同于
    echo $(date)

14、理解好单引号和双引号以及没有引号的使用:
    root@anLA7856:/etc# a=192.168.1.2
    root@anLA7856:/etc# a=192.168.1.2-$a
    root@anLA7856:/etc# b='192.168.1.2-$a'
    root@anLA7856:/etc# c="192.168.1.2-$a"
    root@anLA7856:/etc# echo "a=$a"
    a=192.168.1.2-192.168.1.2
    root@anLA7856:/etc# echo a
    a
    root@anLA7856:/etc# echo $a
    192.168.1.2-192.168.1.2
    root@anLA7856:/etc# echo "b=$b"
    b=192.168.1.2-$a
    root@anLA7856:/etc# echo "c=${c}"
    c=192.168.1.2-192.168.1.2-192.168.1.2

15、awk命令下,调用shell变量的特殊用法:
    root@anLA7856:/etc# ETT=123
    root@anLA7856:/etc# awk 'BEGIN {print $ETT}'

    root@anLA7856:/etc# awk 'BEGIN {print "$ETT"}'
    $ETT
    root@anLA7856:/etc# awk 'BEGIN {print '$ETT'}'
    123
    root@anLA7856:/etc# awk 'BEGIN {print "'$ETT'"}'
    123
   当变量是加双引号时(同单引号)
    root@anLA7856:/etc# ETT="tingting"
    root@anLA7856:/etc# awk 'BEGIN {print $ETT}'

    root@anLA7856:/etc# awk 'BEGIN {print '$ETT'}'

    root@anLA7856:/etc# awk 'BEGIN {print "$ETT"}'
    $ETT
    root@anLA7856:/etc# awk 'BEGIN {print "'$ETT'"}'
    tingting
   当变量加反引号时:
    root@anLA7856:/etc# ETT=`pwd`
    root@anLA7856:/etc# awk 'BEGIN {print "$ETT"}'
    $ETT
    root@anLA7856:/etc# awk 'BEGIN {print $ETT}'

    root@anLA7856:/etc# awk 'BEGIN {print '$ETT'}'
    awk: line 1: runaway regular expression /etc} ...                              #语法报错
    root@anLA7856:/etc# awk 'BEGIN {print "'$ETT'"}'
    /etc

16、往sh脚本里面传入参数:
    root@anLA7856:/home/anla7856/shell# cat paramTest.sh
    echo $1 $2
    root@anLA7856:/home/anla7856/shell# sh paramTest.sh hello helloWorld
    hello helloWorld
    root@anLA7856:/home/anla7856/shell#
   当参数个数大于9时,需要用{}扩起来,以免歧义,如${10}
   $0表示当前脚本的名字,如:
    root@anLA7856:/home/anla7856/shell# cat paramTest.sh
    echo $1 $2 $0
    root@anLA7856:/home/anla7856/shell# sh paramTest.sh hello helloWorld
    hello helloWorld paramTest.sh
    root@anLA7856:/home/anla7856/shell#
   特别的,如果运行时是全路径,则$0也会带有路径
   $#表示给脚本串惨的个数,不包括$0

17、dirname和basename基本用法:
    root@anLA7856:/home/anla7856/shell# dirname paramTest.sh
    .
    root@anLA7856:/home/anla7856/shell# basename paramTest.sh
    paramTest.sh
    root@anLA7856:/home/anla7856/shell# cd /
    root@anLA7856:/# dirname /home/anla7856/shell/paramTest.sh
    /home/anla7856/shell

18、测试set设置位置参数(同命令行脚本穿参)
    root@anLA7856:/# set "I am" handsome anla7856.
    root@anLA7856:/# echo $1
    I am
    root@anLA7856:/# echo $2
    handsome
    root@anLA7856:/# echo $3
    anla7856.
    root@anLA7856:/# echo $#
    3
    root@anLA7856:/# echo $*
    I am handsome anla7856.
    root@anLA7856:/# echo $@
    I am handsome anla7856.
    root@anLA7856:/# for i in $*;do echo $i;done
    I
    am
    handsome
    anla7856.
    root@anLA7856:/# for i in $@;do echo $i;done
    I
    am
    handsome
    anla7856.
    root@anLA7856:/# for i in "$*";do echo $i;done
    I am handsome anla7856.
    root@anLA7856:/# for i in "$@";do echo $i;done
    I am
    handsome
    anla7856.
    root@anLA7856:/# for i;do echo $i;done
    I am
    handsome
    anla7856.

19、shell进程的特殊状态变量说明:
    root@anLA7856:/# echo $?  #获取上一个指令的执行状态返回值(0为成功,非零为失败)
    0
    在一般场景下,"$?"返回值用法:
    1):判断命令,判断脚本或函数等程序是否执行成功;
    2):若在脚本中执行"exit数字",则会把这个数字以函数形式传给"$?"
    3):如果在函数里,则会通过"return 数字",把这个数字传给"$?"
    root@anLA7856:/# echo $$  #获取当前执行的shell脚本的进程号,不常用
    3710
    root@anLA7856:/# echo $!  #获取上一个在后台的进程的进程号,不常用

    root@anLA7856:/# echo $_ 获取在此之前执行的命令或脚本的最后一个参数,不常用
    echo

20、eval的相关用法
    root@anLA7856:/home/anla7856/shell# vi eval.sh
    root@anLA7856:/home/anla7856/shell# sh eval.sh arg1 arg2
    arg2
    root@anLA7856:/home/anla7856/shell# cat eval.sh
    eval "echo \$$#"
    root@anLA7856:/home/anla7856/shell#