首页 > 代码库 > linux shell 总结 (整理)

linux shell 总结 (整理)

ls /usr/bin/info#路径操作dirnamebasename#“”和‘’与 ` ` 在shell变量中的区别      “ ” 允许通过$符引用其他变量‘’禁止引用其他变量符,视为普通字符`` 将命令执行的结果输出给变量 #执行一个命令,但不保存在命令历史记录中<space>commandman ascii #并行执行的命令之间添加&,多条命令就可以并行执行。ls & echo aaaaaaaa & echo fesfsfse#串行执行命令“&&”。如果要查看一个程序所执行的时间,可以使用命令date&&./需要执行的程序&&date来查看#shell1 && shell2 ,如果是用&&符连接的,那只有在shell1返回0(即正常)时,shell2才会执行,否则shell2根本就不执行,所以前面说得最后一种cd&&rm的这种做法是可行的,而且是安全的。那||呢,对于shell1||shell2,只有在shell1执行失败时,shell2才会执行,否则shell2是不执行得常用的 for 循环{#for循环a="a b c d e f"for x in $a; do  echo $x+q; donefor x in {1..9}; do  echo $x; donefor x in `seq 30`; do echo $x; doneselect a in 1 2 3 4 5 6 7; do echo $a; done #创建选择菜单,无限循环sh -v install.sh #查看执行的代码sh -n install.sh #语法检查,没有错误不显示内容f=/home/config.iniwhile read -r b; do echo $b+dada; done < "$f" #一行一行读取文件while read b; do echo $b+dada; done < $fwhile read b; do echo "your input is $b"; done #读入键入的内容cat 1.txt |while read line; do echo $line; done #读取文件for x in `cat 1.txt`; do echo $x; done #按空格和回车读取文件}done & #后台执行循环echo $SHELL  #查看当前环境所使用的shell解释器#脚本一般第一行为:#!/bin/bashchsh -l #查看系统支持哪些shell解释器whereis ls # 查找命令的目录which # 查看当前要执行的命令所在的路径echo -n 123456 | md5sum # md5加密vi /etc/hosts # 查询静态主机名alias # 别名vmstat 1 9 # 每隔一秒报告系统性能信息9次ps aux |grep -v USER | sort -nk +4 | tail # 显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3uname -a # 查看Linux内核版本信息stty 用来改变并打印终端行设置的常用命令 >密码read -t 10 varname # 更简单的方法就是利用read命令的-t选项iptables -F # 将防火墙中的规则条目清除掉/etc/init.d/sendmail start # 启动服务 /etc/init.d/sendmail stop # 关闭服务/etc/init.d/sendmail status # 查看服务当前状态/date/mysql/bin/mysqld_safe --user=mysql & # 启动mysql后台运行vi /etc/rc.d/脚本.sh # 开机启动执行 可用于开机启动脚本/etc/rc.d/rc3.d/S55sshd # 开机启动和关机关闭服务连接 # S开机start K关机stop 55级别 后跟服务名rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir # 同步目录 # --delete 无差同步 删除目录下其它文件ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增加逻辑IP地址mtr -r www.baidu.com # 测试网络链路节点响应时间 # trace ping 结合echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁pingipcalc -m "$ip" -p "$num" # 根据IP和主机最大数计算掩码ssh -p 22 root@192.168.1.209 CMD # 利用ssh操作远程主机scp -P 22 文件 root@ip:/目录 # 把本地文件拷贝到远程主机scp -r root@192.168.1.209:远程目录 本地目录 # 把远程指定文件拷贝到本地sshpass -p 密码 ssh -n root@$IP "echo hello" # 指定密码远程操作ssh -o StrictHostKeyChecking=no $IP # ssh连接不提示yesdu -h 目录 # 检测目录下所有文件大小du -sh * # 显示当前目录中子目录的大小#鸟整理ls -l --full-time #显示具体时间ls --full-time resource/LANG=en_US #修改诧系ls -R resource/ #递归显示users # 显示所有的登录用户groups # 列出当前用户和他所属的组who -q # 显示所有的登录用户groupadd # 添加组useradd user # 建立用户passwd 用户 # 修改密码chown -R user:group # 修改目录拥有者(R递归)chown y\.li:mysql # 修改所有者用户中包含点"."umask # 设置用户文件和目录的文件创建缺省屏蔽值chgrp # 修改用户组finger # 查找用户显示信息echo "xuesong" | passwd user --stdin # 非交互修改密码useradd -g www -M -s /sbin/nologin www # 指定组并不允许登录的用户,nologin允许使用服务useradd -g www -M -s /bin/false www # 指定组并不允许登录的用户,false最为严格usermod -l 新用户名 老用户名 # 修改用户名usermod -g user group # 修改用户所属组usermod -d 目录 -m 用户 # 修改用户家目录usermod -G group user # 将用户添加到附加组gpasswd -d user group # 从组中删除用户su - user -c " #命令1; " # 切换用户执行脚本{ #!/bin/sh # 在脚本第一行脚本头 # sh为当前系统默认shell,可指定为bash等shellsh -x # 执行过程sh -n # 检查语法(a=bbk) # 括号创建子shell运行basename /a/b/c # 从全路径中保留最后一层文件名或目录dirname # 取路径$RANDOM # 随机数$$ # 进程号source FileName # 在当前bash环境下读取并执行FileName中的命令 # 等同 . FileNamesleep 5 # 间隔睡眠5秒trap # 在接收到信号后将要采取的行动trap "" 2 3 # 禁止ctrl+c$PWD # 当前目录$HOME # 家目录$OLDPWD # 之前一个目录的路径cd - # 返回上一个目录路径local ret # 局部变量yes # 重复打印yes |rm -i * # 自动回答y或者其他ls -p /home # 查看目录所有文件夹ls -d /home/ # 查看匹配完整路径echo `ls`   #执行 lsecho -n aa;echo bb # 不换行执行下一句话 将字符串原样输出echo -e "s\tss\n\n\n" # 使转义生效echo $a | cut -c2-6 # 取字符串中字元echo {a,b,c}{a,b,c}{a,b,c} # 排列组合(括号内一个元素分别和其他括号内元素组合)echo $((2#11010)) # 二进制转10进制echo aaa | tee file # 打印同时写入文件 默认覆盖 -a追加echo {1..10} # 打印10个字符printf %10s\n|tr " " a # 打印10个字符pwd | awk -F/ { print $2 } # 返回目录名tac file |sed 1,3d|tac # 倒置读取文件 # 删除最后3行tail -3 file # 取最后3行outtmp=/tmp/$$`date +%s%N`.outtmp # 临时文件定义:(){ :|:& };: # 著名的 fork炸弹,系统执行海量的进程,直到系统僵死echo -e "\e[32m....\e[0m" # 打印颜色echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印颜色}变量{A="a b c def" # 将字符串复制给变量A=`cmd` # 将命令结果赋给变量A=$(cmd) # 将命令结果赋给变量eval a=\$$a # 间接调用i=2&&echo $((i+3)) # 计算后打印新变量结果i=2&&echo $[i+3] # 计算后打印新变量结果a=$((2>6?5:8)) # 判断两个值满足条件的赋值给变量A=(a b c def) # 将变量定义为組数$1 $2 $* # 位置参数 *代表所有env # 查看环境变量env | grep "name" # 查看定义的环境变量set # 查看环境变量和本地变量read name # 输入变量readonly name # 把name这个变量设置为只读变量,不允许再次设置readonly # 查看系统存在的只读文件export name # 变量name由本地升为环境export name="RedHat" # 直接定义name为环境变量export Stat$nu=2222 # 变量引用变量赋值unset name # 变量清除export -n name # 去掉只读变量shift # 用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1name + 0 # 将字符串转换为数字number " " # 将数字转换成字符串a=`ps -auxh|grep node|awk {print $2}`for x in seq $a; do kill $x; done #删除node的所有进程}declare -F #显示当前可见的所有函数declare -f #查看详细函数代码 ifconfig网卡{#网卡的常用命令ifconfig -a #查看所有网卡ifconfig eth85ifconfig eth85 downifconfig eth85 up#在eth85网口上,配置IP地址为156.41.50.11、子网掩码为255.255.255.0的IPifconfig eth85 156.41.50.11 netmask 255.255.255.0#删除eth85网口上,IP地址为156.41.50.12、子网掩码为255.255.255.0的IPip addr del 156.41.50.12/24 dev eth85ifconfig eth1:0 10.175.102.123 netmask 255.255.252.0 up 配置浮动ip#防止重启失效在/etc/sysconfig/network目录下,vi ifcfg-【网卡名称】【Mac地址】例:ifcfg-eth1 ifcfg-E0:24:7F:B6:FD:1B在文件中加入IP信息,并保存文件BOOTPROTO=staticSTARTMODE=autoIPADDR=182.3.1.180NETMASK=255.255.0.0重启网卡让IP生效 rcnetwork restart eth5#样例BOOTPROTO=staticBROADCAST=‘‘IPADDR=192.121.1.71NETMASK=255.255.255.0STARTMODE=autoUSERCONTROL=noFIREWALL=noDEVICE=eth1}变量{#赋值时等号两边不能有空格#在使用变量时,要在变量前面加上符号$,但定义的时候不需要变量的范围1、未经特殊处理的变量均为全局变量脚本中定义了的变量可以在该脚本中任何其他地方使用。注意:函数内部定义的变量也可以在该函数以外使用。2、可以用export把普通变量变成环境变量环境变量可以被其子进程使用,而普通变量不可以。export $var3、可以用local来定义一个局部变量local关键字只能在函数内部使用。用local定义的变量只能在本函数。#特殊变量有些变量是一开始执行Script时就会设定,拥有特定含义,并且不能加以修改的。这些是系统特殊变量:$0 当前脚本的名称$n 脚本或函数的第n个参数值,n=1..9$* 脚本或函数的所有参数$# 脚本或函数的参数个数$$ 当前shell进程的pid$! 上一个shell后台进程的pid$? 上一条命令返回值其他参数:$CDPATH 包含一系列目录名,cd命令对他们诸葛进行搜索来查找作为参数传递给它的目录;如果该变量未设置,cd命令搜索当前目录$EDITOR 程序(如e-mail程序)里使用的默认编辑器$ENV UNIX查找配置文件的路径$HOME 用户初次登录时的起始目录名$MAIL 用户的系统邮箱文件的名称$MAILCHECK shell检查用户邮箱是否有新邮件并将结果通知用户的间隔时间(以秒为单位)$PATH 包含用户的搜索路径的变量—shell用来搜索外部命令或程序的目录$PPID 父进程的进程ID$PS1 系统第一个提示符,一般为$$PS2 系统第二个提示符,一般为>$PWD 当前工作目录的名称$TERM 用户的控制终端的类型.$LINENO 所在的代码行,一般用来输出错误行号shift [n] 将命令行参数往左移n位,但$0不变export 变量名表 将变量名表所列变量传递给子进程read 变量名表 从标准输入读字符串,传给指定变量echo 变量名表 将变量名表指定的变量显示到标准输出set 显示设置变量env 显示目前所有变量 set命令可以重新设定参数表.如set hello wold命令会设定$*为字符串hello world,$n和$#也同时受影响。shift命令可以将所有参数左移一个单位,$*、$n、$#均受影响}数组{1.初始化#!/bin/bash#指定索引值array1[0]=onearray1[1]=1echo ${array1[0]}echo ${array1[1]}#全数组初始化array2=( one two three )echo ${array2[0]}echo ${array2[2]}#间隔索引array3=( [9]=nine [11]=11 )echo ${array3[9]}echo ${array3[11]}#读取键盘输入,空格隔开,换行结束read -a array4exit 02.操作!/bin/basharray=( apple bat cat dog elephant frog )#打印第一个元素echo ${array[0]}echo ${array:0}#打印所有元素echo ${array[@]}echo ${array[*]}echo ${array[@]:0}#除了第一个元素,打印所有元素echo ${array[@]:1}#从第二个元素开始,打印四个元素echo ${array[@]:1:4}#第一个元素的长度echo ${#array[0]}echo ${#array}#总元素数echo ${#array[*]}echo ${#array[@]}#将元素的a替换为Aecho ${array[@]//a/A}exit 03.遍历for i in “${array[@]}”do#access each element as $i. . .donefor x in ${b[@]};do echo $x; done4.删除直接通过:unset 数组[下标] 可以清除相应的元素。echo ${varlist[*]}1 100 3 4 5 8unset varlist[7]echo ${varlist[*]}1 100 3 4 5不带下标,清除整个数据unset varlist}sed{sed -i s/cpu/lgj/ sys_info.txt #将修改生效到原文件常用sed的语法:1. p:打印sed num1,num2p fileName #打印fileName中的num1到num2行2. s:替换字符串sed s/str1/str2/ fileName #把fileName中str1替换成str2(只替换每一行中的第一个str1)3. g:全局sed s/str1/str2/g fileName #把fileName中str1替换成str2(替换所有的)4. y:替换字符sed y/abc/ABC/g fileName #把fileName中所有的a替换成A,b替换成B,参数-e:执行一条命令。可以用-e参数给一行一次执行多条命令以提高效率sed –e command1 –e command2 …… fileName #文件中的每一行执行命令:command1 #command2 ......^:行的开头$:行的结尾sed s/^str1/str2/ fileName #把fileName中每行开头的str1替换成str2sed –e s/^str1/str2/ –e s/str1$/str2/ fileName 一些常用场景介绍:1.行的匹配sed -n 2p /etc/passwd 打印出第2行sed -n 1,3p /etc/passwd 打印出第1到第3行sed -n $p /etc/passwd 打印出最后一行sed -n /user/p /etc/passwd 打印出含有user的行sed -n /\$/p /etc/passwd 打印出含有$元字符的行,$意为最后一行2.插入文本和附加文本(插入新行)sed -n /FTP/p /etc/passwd 打印出有FTP的行ftp:x:14:50:FTP User:/var/ftp:/sbin/nologinsed /FTP/ a\ 456 /etc/passwd 在含有FTP的行后面新插入一行,内容为456sed /FTP/ i\ 123 /etc/passwd在含有FTP的行前面新插入一行,内容为123sed /FTP/ i\ "123" /etc/passwd在含有FTP的行前面新插入一行,内容为"123"sed 5 a\ 123 /etc/passwd 在第5行后插入一新行,内容为123sed 5 i\ “12345” /etc/passwd 在第5行前插入一新行,内容为“123453.删除文本sed 1d /etc/passwd 删除第1行sed 1,3d /etc/passwd 删除第1至3行sed /user/d /etc/passwd 删除带有user的行sed -i /^$/d ver_info.txt #删除空行sed s/remote_gateway_hostname.*/remote_gateway_hostname=/ config.ini #很有用4. 替换文本,替换命令用替换模式替换指定模式,格式为:[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]sed s/user/USER/ /etc/passwd 将第1个user替换成USER,g表明全局替换sed s/user/USER/g /etc/passwd 将所有user替换成USERsed s/user/#user/ /etc/passwd 将第1个user替换成#user,如用于屏蔽作用sed s/user// /etc/passwd 将第1个user替换成空sed s/user/&11111111111111/ /etc/passwd 如果要附加或修改一个很长的字符串,可以使用( &)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面,这里是把&放前面sed s/user/11111111111111&/ /etc/passwd 这里是将&放后面5. 快速一行命令下面是一些一行命令集。([ ]表示空格,[ ]表示t a b键)s / \ . $ / / g 删除以句点结尾行-e /abcd/d 删除包含a b c d的行s / [ ] [ ] [ ] * / [ ] / g 删除一个以上空格,用一个空格代替s / ^ [ ] [ ] * / / g 删除行首空格s / \ . [ ] [ ] * / [ ] / g 删除句点后跟两个或更多空格,代之以一个空格/ ^ $ / d 删除空行s / ^ . / / g 删除第一个字符s /COL \ ( . . . \ ) / / g 删除紧跟C O L的后三个字母s / ^ \ / / / g 从路径中删除第一个s / [ ] / [ ] / / g 删除所有空格并用t a b键替代S / ^ [ ] / / g 删除行首所有t a b键s / [ ] * / / g 删除所有t a b键如果使用sed对文件进行过滤,最好将问题分成几步,分步执行,且边执行边测试结果。}cat{主要有三大功能:1.一次显示整个文件。$ cat filename2.从键盘创建一个文件。$ cat > filename <<qqqq创建fiename文件,追加内容,遇到qq时结束输入只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件: $cat file1 file2 > file cat -n config.ini 显示行编号}cut{cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]使用说明cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。 主要参数-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。-c :以字符为单位进行分割。-d :自定义分隔符,默认为制表符。-f :与-d一起使用,指定显示哪个区域。-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除#实例$ cat /etc/passwd | tail -n 5 | cut -d : -f 1postfixapacheicecreammysqlnews}du{查看目录的大小-s 只显示最终结果-m 以M为单位显示-k 以K为单位显示-h 以合适的单位显示常用:du –hs ./*}expect {#!/usr/bin/expect -fif {$argc < 2} {#打印  puts stdout "$argv0 err params\n"  exit 1}#行后面不可以加注释#定义函数proc do_console_login {login pass} {puts $login;puts $pass;}#打印参数长度puts [llength $argv]#设置变量#set timeout -1 设置expect永不超时set timeout 5#设置超时时间set user [lindex $argv 0]#获取脚本运行时带的第一个参数值set password [lindex $argv 1]#调用函数do_console_login $user $password spawn ssh $user@10.175.102.219#判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,等待时长就是前面设置的10秒。#开始匹配后,里面不可以在行后面加注释expect {   "(yes/no)?" {send "yes\r"expect "password:"send "$password\r"exp_continue}"*assword" {send "$password\r"exp_continue}} ########## puts 会把所有的打印都放在一起#############遍历的几种方法:foreach i { 1 3 5 7 9 } {puts "$i"}#i默认增量是1,即等价incr i 1puts "---1---"for {set i 0} {$i < 3} {incr i} {puts "I inside first loop: $i"} puts "---2---"for {set i 3} {$i < 2} {incr i} {puts "I inside second loop: $i"} puts "---3---"set i 0while {$i < 4} {puts "I inside third loop: $i"incr iputs "I after incr: $i"} set i 0incr iputs "---4---"puts "$i"#expect里的加减法set i [expr {$i + 1}]puts "---5---"puts "$i" #替代手工输入,执行命令,每条命令以空格隔开!if { 1 eq 1 } {puts "SYNC complete!"} else {puts "SYNC error!"}#if 的用法set File "/usr/lgj"if {[file isfile $File]!=1} {send_user "$argv0: file $File not found. "send_user "mkdir $File\n"send "cd /usr/\r mkdir $File\n"send "cd lgj\n touch 11.log\r"}send_user "for use\n" send_user "read file as print\n"   #################打开原主机中的文件在登陆机上打印################set fd [open "./test.sh" "r"]set number 0# read each linewhile { [gets $fd line] >= 0} {incr number#puts "Number of lines: $number"puts $line}send_user "read file as cmd\n"close $fd#################打开原主机中的文件作为shell命令行在登陆机上执行#####set fd [open "./lgj.sh" "r"]set number 0while { [gets $fd line] >= 0} {incr numbersend "$line\n"}close $fd puts "you do next!";#把控制权交给控制台,这个时候就可以手工操作interact}  

 

linux shell 总结 (整理)