#等号两边不能有空格
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 代表开启扩展正则表达式