初学Linux(3)

来源:互联网 发布:优化xp电脑批处理工具 编辑:程序博客网 时间:2024/05/18 12:39


使用bash命令历史
history命令可查询历史操作命令
.bash_history中的命令数目由HISTFILESIZE这个变量决定
history表存储在内存内。用户logout时会记录到用户主目录中.bash_history文件
命令历史中的命令可以被调用     如 下方例子:


[hadoop@bi-test home]$ !!    执行上一次命令
bash


[hadoop@bi-test ~]$ !960      执行第960号命令    
ls
1103.log  15-11-03.log  a1.txt  a.txt  b.txt  c  ddd


[hadoop@bi-test ~]$ ls ./ddd   一个ls命令(表示上一个命令)
a1.txt  b.txt
[hadoop@bi-test ~]$ !$      用来显示上一个命令的参数   即./ddd
./ddd
bash: ./ddd: is a directory


Bash的变量类型:


[hadoop@bi-test ~]$ set   显示出来的Shell的普通变量和环境变量


[hadoop@bi-test ~]$ env   显示出来的Shell的环境变量


如果只是定义AAA=aaaaaaaa  这是一个普通变量
使用 export AAA=aaaaaaaa就变成了环境变量


alias别名:


[hadoop@bi-test ~]$ alias ooo='echo $PATH'   给echo $PATH  命令取一个别名为ooo
[hadoop@bi-test ~]$ ooo   执行ooo  相当于执行 echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/bin


[hadoop@bi-test ~]$ unalias ooo   将上方别名删除
[hadoop@bi-test ~]$ ooo
bash: ooo: command not found

Bash中的运算符:


[hadoop@bi-test ~]$ echo *   用来显示任意多个字符,默认是当前目录的文件名和文件夹名
1103.log 15-11-03.log a1.txt a.txt b.txt c ddd  


[hadoop@bi-test ~]$ echo ??? 用来显示当前目录有三个字母的文件或者文件夹名
ddd 


[hadoop@bi-test ~]$ echo [abc]*    用来显示当前目录以abc任意一个字母开头的文件和文件夹名
a1.txt a.txt b.txt c


[hadoop@bi-test ~]$ echo [^abc]*    用来显示当前目录不是以abc其中任何一个开头的文件和文件夹名
1103.log 15-11-03.log ddd


[hadoop@bi-test ddd]$ ls     显示当前目录为空
[hadoop@bi-test ddd]$ touch {a,b,c}-{1,2,3}    创建文件名字为a-c,和1-3的自由组合
[hadoop@bi-test ddd]$ ls   显示当前目录的文件,即前面一个命令执行后的成果
a-1  a-2  a-3  b-1  b-2  b-3  c-1  c-2  c-3


[hadoop@bi-test ddd]$ touch ./ccc{a,c}  &      将一个创建文件的命令 放到后台运行
[1] 8508
[hadoop@bi-test ddd]$ jobs       通过jobs命令查看后台运行的任务
[1]+  Done                    touch ./ccc{a,c} 


[hadoop@bi-test ~]$ jobs      查看后台任务
[1]+  Stopped                 top
[hadoop@bi-test ~]$ fg %1    通过fg %1命令将后台第一个任务恢复到前台


[hadoop@bi-test ~]$ aaa()    声明一个aaa函数   ()代指声明的作用
> {                          以  {  开始
> echo this is aaa           执行  echo  命令
> ls ./                      执行  ls    命令
> echo end                   执行  echo  命令
> }                          以  }  结束
[hadoop@bi-test ~]$ aaa      执行  aaa   运行结果  如下: 
this is aaa                  
1103.log  15-11-03.log  a1.txt  a.txt  b.txt  c  oo.log
end


“”   ‘’的区别  : “”只屏蔽 空格这个符号    ‘’屏蔽所有特殊符号


[hadoop@bi-test ~]$ ``   这个符号代表将其中的命令预先执行。 
 
\  脱意符


[hadoop@bi-test ~]$ echo ; which ls   符号 ; 的作用是命令分隔符


alias ls='ls --color=auto'
/bin/ls


= 是赋值


[hadoop@bi-test ~]$ [ -f ./c ] && echo ok  [ -f ./c]意思是判断当前目录下是否有c文件, &&意思是前一个命令返回true的情况下,才执行后面的命令
ok


[hadoop@bi-test ~]$ [ -f ./r ] || echo no filr r  || 的意思是如果前面的命令返回的结果是false  则执行后面的命令
no filr r


[hadoop@bi-test ~]$ [ -d ./ccc ] && echo already exist  -d代表判断是不是目录
already exist




[hadoop@bi-test ~]$ echo $$   代表的是当前进程的pid
8378


[hadoop@bi-test ~]$ echo $[ 2+3 ]   $[ ]代表的是 算术运算符   即  2+3=5   所以echo出来 结果是5
5


Bash的启动脚本:


全部设置文件   /etc/profile      
      /etc/bashrc
用户设置文件   ~/.bash_profile
      ~/.bashrc


其他配置脚本:
~/.bash_logout                      当你退出shell时,要执行的脚本  
~/.bash_history                     记录了您以前输入的脚本
~/.bash_profile   当你登入shell时,要执行的脚本
~/.bashrc                           每次打开新的shell时,要执行的脚本


~/.bash_profile和 ~/.bashrc的区别:~/.bash_profile只在会话开始时被读取一次,而~/.bashrc 则每次打开新的终端时,都要被读取。


/etc/profile.d目录下的文件也会在用户登录时执行,但必须是有可执行权限的文件,且其他用户也要有可执行权限 


shell脚本:


shell脚本的种类 有: -Shell script      python      perl等
系统是由shell脚本搭建的
- 如/etc/rc.d/rc.sysinit
- 或 services 命令等
Shell脚本一般是hiASCII码的文本,可以直接编写


脚本中的#表示注释,但是第一行中的#有特殊的意义:
如果第一行中:
第一个字符非#,表示这是一个bash脚本。
第一个字符是#,但第二个字符不是!,表示这是一个csh脚本。
第一个字符是#,且第二个字符是!,
例子: #!/usr/bin/python2.2
      表示调用其后指定的/usr/bin/python2.2程序来执行以下的这个脚本。
reset 命令是将终端恢复打开时的状态




自己写一个简易的shell脚本  如下:
if [ $1 -eq 111 ]; then         判断输入的第一个参数是不是111
echo ok                         如果判断正确,则输出ok
fi                        判断结束
echo $2  \$2                    打印第二个参数
echo $3  \$3                    打印第三个参数
echo $#  \$\#                   打印一共输入了几个参数
echo $?  \$\?                   打印上一个命令是否执行  0代表执行,1代表没执行
echo $$  \$\$                   打印当前进程pid
read -p "please input your name:" AAA         当脚本运行时,会有一个交互,让你输入字符串,赋值给了AAA
printf "$AAA is fool. \n"                     把AAA的值打印出来,并且换行  


说明 . ./   和./的区别:
[hadoop@bi-test ~]$ ./a.txt         这种是指打开一个子shell来执行a.txt     
./a.txt: line 1: [: -eq: unary operator expected
$2
$3
0 $#
0 $?
8836 $$
please input your name:qwewq
qwewq if fool. 
aaaaaaaa
[hadoop@bi-test ~]$ echo $AAA       然后你执行这个命令  AAA是无法打印的。原因就是:子shell里定义的环境变量,在父shell中无法使用


[hadoop@bi-test ~]$ . ./a.txt       这种是指,在当前的shell中执行a.txt
bash: [: -eq: unary operator expected
$2
$3
0 $#
0 $?
8700 $$
please input your name:edfg
edfg if fool. 
aaaaaaaa
[hadoop@bi-test ~]$ echo $AAA        执行的这个命令后,会打印AAA的值
aaaaaaaa


Shell脚本的执行方式
方法一、输入脚本的绝对路径或相对路径   例如   - /tmp/a.txt或者是./a.txt
方法二、bash 脚本 或 tcsh脚本   例如   - bash /tmp/a.txt
方法三、再脚本的路径前加“.”   例如   - . ./a.txt   或者是 - . /tmp/a.txt

前两种本质是打开一个子shell 去执行,后一种是在当前的shell中执行


shell 脚本  使用判断:


[hadoop@bi-test ~]$ cat a1.txt      查看写的shell脚本
if [ $1 = hadoop ]                  判断输入的参数 是不是hadoop
then                         
echo 'I am hadoop !'判断正确时  打印这句话
elif [ $1 = wang ]          判断输入的参数 是不是wang
then
echo 'I am wang !'
else                            如果判断是false则,输出下一句话
echo 'You are not user'
fi
[hadoop@bi-test ~]$ ./a1.txt hadoop    执行上面那个脚本,同时输入参数
I am hadoop !





shell调试
[hadoop@bi-test ~]$ bash -vx ./a1.txt      使用-v可以一边执行脚本,一遍将执行过的脚本命令打印到标准错误输出
#!/bin/bash                                使用-x可以将执行过的每一条命令和结果依次打印出来


read AAA
+ read AAA
aaa
if [ $AAA = hadoop ]
then
echo 'I am hadoop !'
elif [ $AAA = wang ]
then
echo 'I am wang !'
else
echo 'You are not user'
fi
+ '[' aaa = hadoop ']'
+ '[' aaa = wang ']'
+ echo 'You are not user'
You are not user







[hadoop@bi-test ~]$ bash -vx ./b.txt              调试b.txt脚本
#!/bin/bash


read AAA
+ read AAA
hadoop  输入变量的值
case $AAA in                                      case判断
wang)                                     如果是wang  执行下面的操作
echo 'hello wang'
;;    跳出case
hadoop)                  如果是hadoop  执行下面的操作
echo 'hello hadoop'
;;
*)                                        如果是其他字符  执行下面的操作
echo "I don\'t kown the user who he is"
;;
esac                                              case判断结束
+ case $AAA in                                    这是执行的语句
+ echo 'hello hadoop'
hello hadoop


数值比较时的运算符:
相同用  -eq   例如:[hadoop@bi-test ~]$ [ 2 -eq 2 ] && echo ok    
           ok


不同用  -ne   例如:[hadoop@bi-test ~]$ [ 2 -ne 3 ] && echo ok
                   ok


取反用  !+空格    例如:[hadoop@bi-test ~]$ ! [ 2 -eq 3 ] && echo ok    2不等于3  结果为1  取反 结果为0    然后执行echo
ok


大于用  -gt       例如:[hadoop@bi-test ~]$ [ 2 -gt 1 ] && echo ok
ok


小于用  -lt       例如:[hadoop@bi-test ~]$ [ 2 -lt 3 ] && echo ok
ok


大于或等于  -ge       例如:[hadoop@bi-test ~]$ [ 2 -ge 1 ] && echo ok
   ok
   [hadoop@bi-test ~]$ [ 2 -ge 2 ] && echo ok
   ok


小于或等于  -le       例如:[hadoop@bi-test ~]$ [ 2 -le 2 ] && echo ok
                           ok
                                    [hadoop@bi-test ~]$ [ 2 -le 3 ] && echo ok
                                    ok


为空        -z       例如:[hadoop@bi-test ~]$ [ -z $AAA ] && echo ok      AAA变量没有定义  所以为空,所以[ -z $AAA ]结果返回时0  然后执行后面echo
  ok
  [hadoop@bi-test ~]$ echo $AAA




不为空      -n       例如:[hadoop@bi-test ~]$ export AAA=aaaaaaaa         定义AAA环境变量
  [hadoop@bi-test ~]$ [ -n $AAA ] && echo ok      [ -n $AAA ]结果返回时0, 执行后面echo
                                   ok




[hadoop@bi-test ~]$ cat c   
#!/bin/bash               指定让bash这个程序执行


for aaa in `seq 1 100`       seq 1 100  这个是一个1到100的数组             然后for循环
do
echo -n "$aaa "       打印从数组中取出来的数$aaa
sleep 1               睡眠一秒后 继续执行
done






[hadoop@bi-test ~]$ cat e
#!/bin/bash
aa=0
while [ $aa -lt 50 ]           while循环 条件是aa的值小于50  
do
aa=$[$aa+1]       执行aa++
echo -n "$aa "      打印aa的值
done




[hadoop@bi-test ~]$ echo $[ 3*4 ]    使用$[ ]运算符  计算来两个数的积   输出结果如下:
12
0 0
原创粉丝点击