错误重定向,常见命令及用法【永利澳门游戏网址304】

shell

centos shell基础知识 alias  变量单引号 双引号   history 错误重定向
2>&1  jobs  环境变量 .bash_history  source配置文件  nohup & 后台运行
cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF
通配符 glob模式  发邮件命令mail 2015-4-8 第十二节课

   
shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法

 

    shell脚本

set unset export

        以.sh结尾

上半节课

        shell语法+linux命令

history:命令历史
alias :
alias a=”b”
unalias a //取消alias
通配符 glob模式
输入输出重定向
作业控制
管道符
SHELL变量

    注释:

 

        单行注释 : #
        多行注释 : :<<c   c

 

    shell执行方式

下半节课

        bash /path/to/script-name  或   /bin/bash
/path/to/script-name    (强烈推荐使用)
        /path/to/script-name   或  ./script-name   
(当前路径下执行脚本)
        source script-name  或  . script-name   
(注意“.“点号后面有空格)

source和. 点使配置文件
/etc/profile
/etc/bashrc 
~/.bash_profile
~/.bashrc
.bash_history
.bash_logout
shell中的特殊符号
常用命令cut,sort,wc ,uniq ,tee ,tr ,split ,paste
&& 和 ||和;

        前两种执行时,都会开启新的进程执行脚本
        source不会开启新的进程

 

        使用source时,可以与当前终端共享进程,共享变量(重点)

 

    变量

 

        1、name=itcast
        2、name=’itcast $age’  不会解析里面的遍历
        3、name=”itcast $age“ 解析变量后,再拼接成新的字符串

 

    命令变量

history:命令历史(~/.bash_history ) ,默认保存1000条命令历史

        1、name=`ls`
        2、name=$(ls)

!!:上一条命令

        括号里必须是linux命令,把命令执行的结果记录给变量

!$:上一条命令的最后一个参数

    全局变量

!n:执行命令历史里的第n条命令

        方法一:

!字符:最近那个字符的命令

        变量名=值

$?:返回命令是否执行成功,成功返回0

        export 变量

 

        方法二:(最常用)

alias 

        export 变量名=值

注意: alias  空格  cp=’cp -i’  cp和等于号之间不能有空格! 因为看作是变量!
所有一切赋值的操作都不能有空格!按照shell的定义来写

        如果是在终端中定义全局变量,作用范围是当前终端及子进程

# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tild

       
如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:

 

       
修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
       
修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
       
上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source
~/.bashrc或source /etc/profile

alias a="b" 
unalias a   //取消alias

[root@sxx ~]# which rm
alias rm='rm -i'
    /bin/rm
[root@sxx ~]# alias rm
alias rm='rm -i'

    查看变量

 

        标准使用方式:”${变量名}”

实际上cp默认是会覆盖的,出现你这种情况是因为cp被alias成cp
-i了,可以通过alias命令查看。
cp则是告诉shell不要去查alias,直接执行原本的cp

    内置

目前,我得知有四种方法:
1.在调用cp的时候加入绝对路径(可通过whereis cp命令得到),如
/bin/cp -f file dir
2.通过直接执行下面的语句调用系统原始的命令:
cp -f file dir
3.在~/.bashrc里面注释掉 Alias cp=’cp -i’
4.unalias cp ,然后再使用cp,但使用后还原alias cp=’cp -i’

        $0  获取当前执行的shell脚本文件名
        $$  获取执行shell脚本的进程号
        $n 
获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
        $#  获取当前shell命令行中参数的总个数
        $?  获取执行上一个指令的返回值(0为成功,非0为失败)

 

        $?:上一条命令是执行一个文件,返回的结果是文件中的最后一条命令

通配符 glob模式 简化的正则

    默认值

*匹配零个或多个字符

        1、

?匹配一个字符

         变量a如果有内容,那么就输出a的变量值

[] 任意一个 [|]或者  [^]非

        ​ 变量a如果没有内容,那么就输出默认的内容

 

        ​ 格式:

 

             ${变量名:-默认值}

 

        2、

输入输出重定向 >, <, >>, <<, 2>, 2>>

         无论变量a是否有内容,都输出默认值

//下面两个命令等价 反向重定向
[root@steven ~]# cat 123.txt
sdf

[root@steven ~]# cat < 123.txt
sdf

//错误重定向
ls xx 2>error.log

echo "22"  >>error.log 2>&1  //2>&1  能追加 即使开始没有error.log一样可以追加,这样后续的内容不会覆盖error.log原先的内容

        ​ 格式:

 

            ${变量名+默认值}

管道符 |: ls |xargs //显示在一行 

    测试语句

作业控制

        等号左右必须有空格,中括号左右必须有空格

ctrl+z:停止前台任务放到后台

        test a = 1

jobs:查看当前在运行的前/后台任务和ID号

        [ a = 1 ]

# jobs
[1]-  Done                    nohup nc -z -w2 www.baidu.com 1-1024 >> /root/111.txt 2>&1 &
[2]+  Running                 nohup nc -z -w2 www.baidu.com 2000-4000 >> /root/111.txt 2>&1 &

    逻辑表达式

%n   作业号n
kill    %1  //杀死作业

        &&符号
        命令1 && 命令2
        如果命令1执行成功,那么执行命令2
        如果命令1执行失败,那么不执行命令2

10400,10410是pid,1,2是作业号

        ||符号
        命令1 || 命令2
        1 如果命令1执行成功,那么不执行命令2
        2 如果命令1执行失败,那么执行命令2

# jobs -l
[1]+ 10400 Stopped                 vim 123
[2]- 10410 Running                 sleep 200 &

    文件表达式

 

        判断是否是可执行文件

fg: fg 3 //前台运行ID为3的命令
jobs显示的数字ID 或  fg %3 

        [ -f abc ] && [ -x abc ]

加号表示优先级高

    计算表达式

永利澳门游戏网址304 1

        a=$((a+1))
        let a=a+1

bg: bg 3 //后台运行ID为3的命令  或  bg %3 

    重定向

 

        命令>文件

 

        命令返回的结果又正确和错误两种,1代表正确,2代表错误

发送邮件

        bash chongdingxiang.sh >/dev/null 2>&1 &

echo ‘sdf’ #内容 |mail -s “te” #主题  linyonghua.hi@163.com

        把正确的和错误的结果都输出到黑洞文件,而且命令在后台执行

echo 'sdf'  |mail -s "te"   linyonghua.hi@163.com

top -bn 1 |mail -s 'hig $cc'  abc@163.com

    linux四剑客

永利澳门游戏网址304 2

        grep

 

            grep -nr 关键字 .

 

        find

SHELL变量
系统变量名都是大写,自己定义变量小写

            find . -name “*sh”

echo 可以查看变量名  $PATH  ,$HOME, $LANG, $HOSTNAME

        sed

steven@VM~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/steven/bin
[steven@VM ~]$ echo $HOME
/home/steven
[steven@VM ~]$ echo $HOSTNAME
VM
[steven@VM~]$ echo $LANG    
C

       行编辑工具

 

            -i 真正的修改

set比env强,尽量用set

                s:替换
                a:追加
                i:插入
                d:删除

env 命令:可以列出当前用户的所有环境变量以及用户自定义**全局变量 export**

            sed -i “s#sed#SED#g” sed.txt

env |grep '^a'  //查看一下是否有用户自定义a变量

                每一行找到sed,把所有的替换为SED

 

            sed -i “2s#SED#sed#2” sed.txt

# set |grep '^a'   //查看一下是否有用户自定义a变量
a=1

                第二行的第二个SED替换为sed

 

            sed -i “1,4ahello2” sed.txt

set命令:可以把所有变量列出来包括系统的和自定义的全局变量以及当前shell自定义变量 export和非export

                在1到4行的每一行后追加一行内容

 

            sed -i “1ihello3” sed.txt

声明全局变量(子shell也可以用): export
myname=Aming  

                在第1行前插入一行

[root@VM~]# export a=1
[root@VM ~]# bash 
[root@VM~]# echo $a
1
[root@VM ~]# exit 

            sed -i “2d” sed.txt

 

                删除第2行

 

        awk

linux下设置自定义变量规则:

            分析工具,按行处理

(1)格式为 “a=b”, 其中a为变量名,b为变量的内容,等号两边不能有空格

            awk ‘BEGIN{FS=”:”;OFS=”–“} {print $2,$NF}’ awk2.txt

(2)变量名只能由英文、数字以及下划线组成,而且不能以数字开头;

            默认按照空格或tab键拆分数据,通过OFS指定输出时的分隔符

(3)当变量内容带有特殊字符(如空格)时,需要加上单引号 a=’ll abc’ ;

    流程控制

(4)如果变量内容中需要用到其他命令运行结果则可以使用反引号  a=
`which vim` ;  b=`echo
$a`;echo $b 

  

(5)变量内容可以累加其他变量的内容,需要加双引号;

  if语句

//'',"",``的区别  ""有时候会解析结果,要慎用,最好用''
# a='sss'
# b='echo $a'
# echo $b
echo $a
# b=`echo $a`
# echo $b
sss
# b="echo $a"
# echo $b
echo sss

        if [ 条件 ]
        then
             指令1
        elif [ 条件2 ]
        then
            指令2
        else
            指令3
        fi

 

#!/bin/bash

read -p "请输入性别:" sex
if [ "$sex" == "nan" ]
then
echo "输入的是男"
fi
//变量内容累加

b=$a"123"
或者
b=$a'123'
c=$a$b
echo $c

错误:b=$a123

[root@VM_9_115_centos ~]# c=$a$b
[root@VM_9_115_centos ~]# echo $c
ssssss123

# b=$a"123"
[root@VM_9_115_centos ~]# echo $b
sss123


[root@VM_9_115_centos ~]# b=$a'$a'
[root@VM_9_115_centos ~]# echo $b
sss$a
[root@VM_9_115_centos ~]# b=$a"$a"
[root@VM_9_115_centos ~]# echo $b
ssssss

//变量内容累加
// $( ) 和${ } 和$(( )) 与差在哪 

a=sss
b=${a}123
echo $b
sss123
c=$(wc -l /etc/passwd|awk '{print $1}')
echo $c
38
y=$((5+c))
echo $y
43

  case语句

 

#!/bin/bash

case "$1" in
        "start")
        echo "启动"
        ;;
     "stop")
         echo "停止"
        ;;
     "restart")
         echo "重启"
         ;;
         *)
         echo "。。。。"
         ;;
esac

 

  for循环

 

            遍历文件夹

unset :取消全局变量声明 

#!/bin/bash

mkdir ../bak
for file  in $(ls)
do 
    # echo "file: $file"
    cp "$file" ../bak/"${file}-bak"
done
////取消全局变量声明
# export a='22u'
# set | grep '^a'
a=22u
# env |grep '^a'
a=22u
# unset a
# env |grep '^a'
# set | grep '^a'

   seq命令

 

#!/bin/bash

for num in $(seq 5)
do  
     echo "num: $num"
done

 

   while循环


#!/bin/bash

count=1
while [ $count -lt 5 ]
do  
     echo "count: $count"
     let count=count+1
done

下半节课

   until循环

 

#!/bin/bash

count=1
until [ $count -ge 5 ]
do  
     echo "count: $count"
     let count=count+1
done

 

  函数

source和. 点使配置文件即时生效: source
~/.bashrc 或者 . ~/.bashrc //注意点后面有空格 

#!/bin/bash

echo "jiaoben : $1,$2,$3"
dayin(){
if [ $# = 3 ] 
then

echo "hanshu : $1,$2,$3"
else
     echo "需要3个参数"
fi
}

#dayin  e f g
dayin  $1 $2 $3

 

    使用source执行脚本,脚本中定义的变量和函数都能在当前终端调用

系统所有用户使用变量: export myname=Aming
全局变量,加入/etc/profile并source
/etc/profile永久生效
系统某个用户使用变量: export myname=Aming 加入当前用户家目录下的
.bashrc中 source .bashrc 
export myname=Aming 全局变量,export
不加任何选项表示,声明所有的环境变量以及用户自定义变量

         让root用户能够使用python虚拟环境

.系统和个人环境变量的配置文件
/etc/profile PATH, USER,
LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umask等 ,/etc/profile
包含了/etc/bashrc ,尽量将变量的设置放在/etc/profile里
/etc/bashrc
$PS1([root@VM~]#)  umask 以后如果设置umask修改放 /etc/profile
不要改这个/etc/bashrc文件
~/.bash_profile
用户自己的环境变量,用户登录的时候执行,tty1,ssh,su –
,不要犯那个腾讯工程师的错误
~/.bashrc
当用户登录以后每次打开新的shell(子shell)时,或者执行bash ,
执行该文件
.bash_history 记录命令历史用的
.bash_logout :当退出shell时,会执行该文件。

         export WORKON_HOME=/home/python/.virtualenvs/
         source /usr/local/bin/virtualenvwrapper.sh

 

/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc很容易混淆,他们之间有什么区别?它们的作用到底是什么?
/etc/profile: 用来设置系统环境参数,比如$PATH.
这里面的环境变量是对系统内所有用户生效的。
/etc/bashrc:  这个文件设置系统bash
shell相关的东西,对系统内所有用户生效。只要用户运行bash命令,那么这里面的东西就在起作用。
~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile
类似,但是这个是针对用户来设定的,也就是说,你在/home/user1/.bash_profile
中设定了环境变量,那么这个环境变量只针对 user1 这个用户生效.
~/.bashrc: 作用类似于/etc/bashrc,
只是针对用户自己而言,不对其他用户生效。

另外/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.
~/.bash_profile 是交互式、login 方式进入 bash
运行的,意思是只有用户登录时才会生效。
~/.bashrc 是交互式 non-login 方式进入 bash
运行的(例如用rsync的ssh方式),用户不一定登录,只要以该用户身份运行命令行就会读取该文件。

 

 

全局:/etc

用户:~/ 

 

 

shell中的特殊符号
* 匹配符号,零个或多个任意字符
? 匹配符号,1个任意的字符
# 注视说明用的,使后面的内容失去原本的意义
脱义字符,将特殊字符还原为普通字符,用在双引号里面 ,例如 grep
命令和find命令要脱义要用双引号  PS1=”[u@h
W]\$ ” 
|将符号前面命令的结果丢给符号后面的命令,一般针对文档操作的命令比较常用,例如cat,
less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed,
awk等等

$ 引用变量,还有 !$
; 分号,多条命令写一行时,分隔命令
~ 用户家目录    cd ~steven 到steven用户家目录
& 放到命令最后面,让命令在后台运行

让命令在后台运行的两种方法

nohup sleep 10000 &
或者
ctrl+z然后输入bg回车

# nohup sleep 10000 &
[1] 19159
[root@VM_9_115_centos ~]# nohup: ignoring input and appending output to `nohup.out'

[root@VM_9_115_centos ~]# jobs
[1]+ Running nohup sleep 10000 &

 

 

 

常用命令:
1)cut  -d 分隔符(不指定默认以空格为分隔符)跟awk一样     -f 区域
语法: cut -d ‘分隔字符’ [-cf] n 这里的n是正整数
-b
:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了
-n 标志。
-n :取消分割多字节字符。仅和 -b 标志一起使用
-d 后面指定分隔符,用单引号引起来,-f 指定第几段 -f 1,2 或 -f
1-3:  cut -d ‘:’
-f 1 /etc/passwd |head -n 5  
-f :与-d一起使用,指定显示哪个区域。
-c 后面只有一个数字表示截取每一行的第几个字符:   head -n2
/etc/passwd|cut -c2  
-c 后面跟一个数字区域,表示截取每一行从几到几的字符 : head -n2
/etc/passwd|cut -c2-5  

cut的缺点,所以通常用awk

发表评论

电子邮件地址不会被公开。 必填项已用*标注