shell符号总结

#等号两边不能有空格
myname="dsdcsc"
变量赋值时,两边不能有空格

#! 符号能够被内核识别成是一个脚本的开始,这一行必须位于脚本的首行

$0 当前脚本的文件名

$n 第几个参数,n=3则$n是$3 ,注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,            
   需要使用${n}来获取参数。

$# 传递给脚本或函数的参数个数。

$@ 传递给脚本或函数的所有参数,按空格划分成不同的部分。注意: 如果一个参数中有空格,这个参数将会被 
   从空格($IFS默认)处分尸

"$@" 分隔成单个参数,如"$1”“$2”“$3”, $@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分 
   即不会被分尸

$* 传递给脚本或函数的所有参数,按空格划分成不同的部分,与$@没有区别

"$*" 扩展成一个参数,如"$1$2 $3",不论调用时传入了多少个参数,都将被按原样处理成一个整体性的参数 
   使用。$@ $*只在被双引号包起来的时候才会有差异

$? 上个命令的退出状态,或函数的返回值。

$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$! 用于保存运行的最后一个进程的PID 号。

|| 逻辑符号
这个会时常看到,代表 or 逻辑的符号,a||b,当前面a不成立时在判断条件b。

&& 逻辑符号
这个也会常看到,代表 and 逻辑的符号,a&&b,当前面a成立时才判断条件b。

& 后台工作
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
tar cvfz data.tar.gz data > /dev/null&

(command):用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ;echo $vcgh),指令群组有一个特性,shell会以产生 subshell来执行这组指令。因此,在其中所定义的变数,仅作用于指令群组本身。

`command` 倒引号,命令替换,等价于$(),反引号中的shell命令会被先执行
eg:
touch `date+%F`_file.txt等价于touch $(date +%F)_file.txt
disk1="df -h|grep '/$'|awk '{print $4}'"
echo $disk1没结果,这是因为双字符串的原因,他并不会执行这条命令

要改成:
disk1=`df -h|grep '/$'|awk '{print $4}'`
echo $disk1
或者
disk1=$(df -h|grep '/$'|awk '{print $4}')
echo $disk1

read 让用户输入
read -t 180 -p ‘请输入选择:’choose
echo $choose
-p:提示语句
-t:指定时间,不然会一直执行
-s:输入密码时,不回显

&>混合输出重定向  /dev/null 将执行丢弃(不回显命令结果)
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把标准错误输出 重定向到 标准输出.
&>file 意思是把标准输出 和 标准错误输出 都重定向到文件file中


使用正则表达式检测是否为数字
[[ “$num”=~ ^[0-9]+$ ]];echo $?     
~:匹配后面的正则表达式
!~:不匹配后面的正则表达式


^:开头 $:结尾
[0-9]:匹配0-9的数字
+:多个

(1)在一行,敲多个命令,;不具备逻辑判断
eg:
./config;  make; makeinstall

(2)&& || 具备逻辑判断,要看命令返回值echo $?
eg:
./config && make && makeinstall
ping -c1 10.18.42.1 &>/dev/null && echo "up" || echo "down"      ##-c1表示ping 1次,
##从查找:man ping | less ping [][c count]可得知 , &>表示混合重定向
理解的使用:ping -c1 10.18.42.1 &>/dev/null成功了(即echo $?的值为0,不要看返回值来判断!!!),才会执行&&

(3)
command & 后台执行
command &>/dev/null 混合重定向(标准正确输出1,标准错误输出2)
command1 && command2   命令排序,逻辑判断(上一个命令的返回值为真,才会执行)
()	在子shell执行
(()) 	C 风格的数值比较,((1<2))
$(1+2)	和`1+2`一样,叫命令替换:先执行里面的命令,eg:touch $(date +%F)_file.txt
$((1+2))	整数运算

{}		表示集合,eg:touch {1..2}
${}		表示变量

[]		条件测试:文件,整数,数值,字符串比较	
[[]]	功能包含[]的功能,还支持正则比较:[[ =~ ]],~表示正则匹配
eg:[ -d /home -a -f /home/files ];echo $?      等价于
[[ -d /home && -f /home/files ]];echo $? 
$[2**10]		整数运算,2的10次方
  • 调试脚本:
  • sh -n 1.sh	仅调试syntax error
    sh -vx 1.sh 以调试的方式进行,查询整个执行过程
    

    文件测试

  • [ -e dir|file ]		如果 FILE 存在则为真。
    [ -d dir ]		如果 FILE 存在且是一个目录则为真。
    [ -f file ] 是否存在,而且是文件?
    [ -r file ]	当前用户对该文件是否有读权限(除了root用户)
    [ -x file ]	如果 FILE 存在且是可执行的则为真。
    [ -w file ]	如果 FILE存在且是可写的则为真。
    [ -L file ] 是链接文件吗?
    [ -b file ] 是设备文件?
    [ -c file ] 是字符设备吗?
    
    eg:
    [ ! -d /cc ] && mkdir /ccc # 目录不存在就创建
    [ -d /ccc ] || mkdir /ccc #目录存在就不创建
    grep 'cat $1' *   # *代表从所有文件过滤
    

    数值比较

  • [ 整数1 操作符 整数2 ]
    
    [ 1 -gt 10 ] 大于
    [ 1 -lt 10 ] 小于
    [ 1 -eq 10 ] 等于
    [ 1 -ne 10 ] 不等于
    [ 1 -ge 10 ] 大于等于
    [ 1 -le 10 ] 小于等于

    文件

  • 文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。
    常用的文件描述符如下:
    文件描述符          名称         常用缩写     默认值
         0               标准输入      stdin            键盘
         1               标准输出      stdout         屏幕
         2            标准错误输出   stderr          屏幕
    我们在简单地用<或>时,相当于使用 0< 或 1>(下面会详细介绍)。
    * cmd > file
    把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止复盖原有文件。
    * cmd >> file
    把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。
    * cmd < file
    使cmd命令从file读入
    * cmd << text
    从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用<<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考後面的例子。
    * cmd <<< word
    把word(而不是文件word)和後面的换行作为输入提供给cmd。
    * cmd <> file
    以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。
    * cmd >| file
    功能同>,但即便在设置了noclobber时也会复盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。
    : > filename      把文件"filename"截断为0长度.# 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
    cmd >&n 把输出送到文件描述符n
    cmd m>&n 把输出 到文件符m的信息重定向到文件描述符n
    cmd >&- 关闭标准输出
    cmd <&n 输入来自文件描述符n
    cmd m<&n m来自文件描述各个n
    cmd <&- 关闭标准输入
    cmd <&n- 移动输入文件描述符n而非复制它。(需要解释)
    cmd >&n- 移动输出文件描述符 n而非复制它。(需要解释)
    注意: >&实际上复制了文件描述符,这使得cmd > file 2>&1与cmd 2>&1 >file的效果不一样
  • 通配符

  • linux命令,除了awk,sed,grep使用正则表达式,一般都是用的通配符进行匹配
  • (1) *表示:匹配任意多个字符,eg:ls in* ,rm -rf *, find  / -name "*-eth0"
    
    (2) ?表示:匹配任意一个字符 eg:ll l?ve,这个用的非常少
    
    (3) []表示:匹配括号中任意一个字符[abc] [a-z] [0-9] [a-zA-Z0-9]
    (4)[^ ]表示:不匹配括号中的任一字符,[^abc]  [^0-9]
    [^a-zA-Z0-9]:表示既不是英文字母也不是数字
    
    (4)()表示在子shell中执行   (cd /boot;ls)   (umask 077; touch file1000)
    
    (5){}表示:集合touch file{1..9}:表示创建文件file1,file2,。。。。。file9
    mkdir /home/{111,222}
    cp -rv /etc/sysconfig/network-script/ifcfg-eth0 /etc/sysconfig/network-eth0.old
    
    (6)\:表示转义符,让通配符回归本意,只转义其紧接着的后面的字符,-e和\n要一起用
    echo -e "anb\n"
    结果:
    anb
    
    echo  "a\nb"
    输出:
    a\nb
    带颜色输出
    echo -e "\e[31mcdjccnef\e[0m"

    变量内容的删除

  • 使用通配符*表示任意多个字符
    
    (1)url=www.sina.com.cn
    echo ${#url}   获取变量值的长度
    15
    
    echo ${url}   标准查看
    www.sina.com.cn
    
    echo ${url#*.}	从前往后,最短匹配,#表示从前往后匹配,删除匹配的内容,查到第一个.停止
    sina.com.cn
    
    echo ${url##*.} 从前往后,最长匹配,贪婪匹配,##表示从前往后匹配,删除匹配的内容,直到最后一个.
    cn
    
    (2)url=www.sina.com.cn
    echo ${url}
    www.sina.com.cn
    
    echo ${url%.*}  从后往前,最短匹配,%表示从后向前匹配,删除匹配的内容,查到第一个.停止
    www.sina.com
    
    echo ${url%%.*} 从后往前,最长匹配,贪婪匹配,%%表示从后向前匹配,删除匹配的内容,查到最后.停止
    www
    
    (3)url=www.sina.com.cn
    echo ${url#a.}
    www.sina.com.cn  错误的结果,没有匹配到a开头的内容
    
    echo ${url#*sina.}
    com.cn
    
  • 利用索引进行切片
  • 索引从0开始
    url=www.sina.com.cn
    echo ${url}   标准查看
    www.sina.com.cn
    
    echo ${url:0:5}    从第0个取,取5个
    www.s
    
    echo ${url:5:5} 
    ina.c
    
    echo ${url:5}  从第5个开始
    ina.com.cn

    变量内容的替换1

  • url=www.sina.com.cn
    echo ${url}   标准查看
    www.sina.com.cn
    
    echo ${url/sina/baidu}    变量/原字符/新字符,替换匹配的第一个内容
    www.baidu.com.cn
    
    echo ${url/n/N}
    www.siNa.com.cn
    
    echo ${url//n/N}      //表示贪婪匹配,替换全部符合的内容
    www.siNa.com.cN
    
    

    变量内容的替换2

  • (1)-的意思:凡是变量有被定义过,就不能被替代
    unset var1   删除变量var1的值
    echo ${var1}
    echo ${var1-aaa}
    aaa
    
    var2=111
    echo ${var1-bbb}
    bbb
    
    var3=
    echo ${var3-ccc}
    
    ${变量名-新的变量值}
    变量没有被赋值:会使用“新的变量值”替换
    变量有被赋值(包括空值):不会被替代
    
    (2):-表示:变量若是没有值或者是空值,就给你个值
    unset var1
    unset var2
    unset var3
    
    var2=
    var3=111
    echo ${var1:-aaaa}
    aaaa
    echo ${var2:-aaaa}
    aaaa
    echo ${var3:-aaaa}
    111
    
    ${变量名:-新的变量值}
    变量没有被赋值(包括空值):都会使用“新的变量值”替代
    变量有被赋值:不会被替代
    
    
    (3)其它
    echo ${var3+aaa}
    echo ${var3:+aaa}
    
    echo ${var3=aaa}
    echo ${var3:=aaa}
    
    echo ${var3?aaa}
    echo ${var3:?aaa}
    
    
  • 正则表达式

  • linux命令,除了awk,sed,grep使用正则表达式,一般都是用的通配符进行匹配

  • 元字符

  • 1) . 表示:匹配一个除换行符以外的任意字符,
    a.b   匹配a开头,b结尾,中间任意字符的单词
    
    2)^ 表示:匹配行首
    ^ab  匹配以ab为行首的单词
    
    3)$ 表示:匹配行首
    $ab  匹配以ab为行尾的单词
    
    4)\ 表示:转义符
    \<  转换<原本的含义
    
    5)< > 表示:匹配一个单词
    \<abc\>  精确匹配单词abc
    
    6)\| 表示:逻辑或
    ab\|AB  匹配单词ab或AB
    
    7)< > 表示:匹配一个单词
    \<abc\>  精确匹配单词abc
  • 范围

  • 1)[ ] 表示匹配一个指定范围的字符
    a[xyz]b,匹配a开头,b结尾,中间是x或y或z的单词
    
    2)[^ ] 表示匹配一个不在指定范围的字符
    a[^xyz]b,匹配a开头,b结尾,中间不包括x或y或z的单词

  • 重复1

  • 匹配尽可能多的匹配,连续重复出现

  • 
    1)? 使前面的字符重复0次或1次
    a?   匹配a出现0次或者1次的单词
    
    2)* 使前面的字符重复0次或n次
    a*   匹配a连续出现0次或者n次的单词
    
    3)+ 使前面的字符重复1次或多次
    a+   匹配a连续出现至少一次单词
    
    4){n} 使前面的字符重复n次
    a{3}   匹配a连续出现3次的单词
    
    5){n,} 使前面的字符重复n次或以上
    a{3,}   匹配a连续出现至少3次的单词
    
    6){n,m} 使前面的字符重复n次到m次
    a{3,8}   匹配a连续出现3次到8次的单词

  • 重复2

  • 匹配尽可能少的匹配,连续重复出现

  • 1)?? 使前面的字符重复0次或1次
    a??   尽量少的匹配a出现0次或者1次的单词
    
    2)*? 使前面的字符重复0次或n次
    a*?   尽量少的匹配a连续出现0次或者n次的单词
    
    3)+? 使前面的字符重复1次或多次
    a+?   尽量少的匹配a连续出现至少一次单词
    
    4){n}? 使前面的字符重复n次
    a{3}?   尽量少的匹配a连续出现3次的单词
    
    5){n,}? 使前面的字符重复n次或以上
    a{3,}?   尽量少的匹配a连续出现至少3次的单词
    
    6){n,m}? 使前面的字符重复n次到m次
    a{3,8}?   尽量少的匹配a连续出现3次到8次的单词
  • grep用法

  • -i 忽略大小

    -n 打印行号

    -v 反向过滤内容

    -r 目录递归搜索

    -l 打印模式匹配到的文件

    -w 精确匹配整个单词

    -o 仅输出匹配到的内容

    -A 打印匹配到行之后的多少行 其后加数字

    -B 打印匹配到行之前的多少行 其后加数字

    -C 打印匹配到行的前后多少行 其后加数字

    -E 代表开启扩展正则表达式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值