SHELL命令总结

1) shell 简介
shell 本身是由C语言编写的程序,它是Linux的桥梁;

脚本编程: awk / python /ruby /perl /shell
编译型语言: C C++ java

脚本编程的优势:
1) 简单易学;
2) 能够轻松处理文件和目录
3) 运行在编译型语言的上层
缺点:
1) 执行效率不如编译型语言

2) 编写一个shell
其实就是一些命令的累加

echo 默认情况下,输出内容后,会自动换行
-e 打开转义功能 可以'\'
-n 表示输出内容后,不再自动换行

\\ backslash

\a alert (BEL) 可以发出警告
\b backspace 可以删除前一个字符
\c produce no further output 最后不加上换行符
\n new line 换行符
\r carriage return 光标移至行首,但不换行;
\t horizontal tab 插入tab

设置文件的颜色:
[root@server0 ~]# echo -e "\E[1;31m Hello \E[0m"

\E 表示引导非常字符
1 31 表示颜色的值
m 表示设置属性后结束非常规字符;

 

read -p 读取屏幕输入或读取文件内容

 

3) shell 变量

变量的分类:
1. 局部变量
2. 环境变量
3. 特殊变量

 

自定义变量

变量名="value"

注意:
1. 变量名必须要以字母开头;
2. 变量名不能用空格,可以用下划线
3. 变量名不能使用其它标点符号
4. 不能使用bash关键字;

 

调用变量

echo "$aabc" 使用$调用变量
echo "${a}abc" 建议使用{}将变量名括起来

 

重定义变量
a=200
echo "${a}abc"

a=222
echo $

 

只读变量:

a=200
echo "${a}abc"
readonly a
a=222
echo $a

 

删除变量:
unset a //删除a的变量值

 

 

4) 特殊变量

$0 表示当前脚本的文件名
$n 表示调用第n个参数
$# 表示调用参数的个数
$? 表示上个命令的退出状态或函数值返回 如果命令执行成功,则返回0; 如果命令没有成功,则返回1;
$$ 表示当前shell的进程ID
$* 表示给脚本传递所有参数 被""起来时,所有参数会以一个整体做为参数传递;
$@ 表示给脚本传递所有参数 会将各个参数分开,进行传递;

 

5) shell 运算符

shell命令的替换:
#!/bin/bash
ipadd=`ip addr | grep global | awk '{print $2}'| awk -F / '{print $1}'`
echo "your IP Address is ${ipadd}"

变量的替换:

${var} 表示调用变量本身的值
${var:-word} 表示如果变量为空或被删除,那么返回word,但是不改变var的值;
${var:+word} 表示如果var有值,则临时修改变量的值为word,但不会修改原var值;
#这个可以用于回车赋默认值,与 [ -z $var ] && var=word 相同
#在做删除的危险动作时一定要做此返回操作,如果路径为空则删除Null
#find ${pathname:=/dev/null/} -name file | xargs rm -rf
${var:=word} 表示如果变量为空或被删除,那么返回word,并将var变量值设置为word;
${var:?word} 表示如果变量为空或被删除,则发送word信息到标准错误输出;
${var:%string} 表示截取字符串

Bash 支持的运算符:
1) 算术运算符
+
-
*
/
%
= //赋值
== 用于比较两个数字是否相等
!= //表示不等于,也是用于比较两个数字

举例:
a=0001
b=20

echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b` //注意 * 运算符必须要转义 \*
echo `expr $a / $b`
echo `expr $a % $b`

 

if [ $a == $b ] 用于比较两个数字
then
echo 'A等于B'
else
echo 'A不等于B'
fi

 

2) 关系运算符 对比两个数字的大小关系, 不支持字符串

-eq 对比两个数字是否相等
-ne 对比两个数字是否不相等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

 

if [ $1 -gt $2 ]
then
echo 'A大于B'
elif
[ $1 -lt $2 ]
then
echo 'A小于B'

else
echo 'A等于B'
fi

 

 

3) 布尔运算符
与 -a
或 -o
非 !

[ $1 -lt 50 -a $2 -gt 30 ]
[ $1 -lt 50 -o $2 -gt 30 ]
[ $1 != 30 ]

命令间的逻辑关系

&& 逻辑与 只有前面的命令为真才执行后面的命令;
|| 逻辑或 只要有一个命令为真就可以执行;

 

例如:
如果 user11 用户不存在,则添加该用户

! id user11 && useradd user11

如果user1存在,则显示该用户,否则添加该用户
id user1 && echo "the user1 was reated" || useradd user1

 

4) 字符串运算符

= 判断两个字符串是否相等 [ $a = $b ]
!=
-z 判断字符串长度是否为0,0为真 [ -z $a ]
-n 判断字符串长度是否不为0,不为0为真 [ -n $a]
str 判断字符串是否为空,不为空为真 [ $a ]

5) 文件测试运算符

-b 判断文件是否为块设备 [ -b $file1 ]
-f 判断文件是否为普通文件
-c 判断文件是否为字符设备
-g 判断文件是否为有SGID位
-u 判断文件是否为SUID位
-r 判断文件是否有读权限
-w 判断文件是否有写权限
-x 判断文件是否有执行权限
-e 判断文件是否存在 [ -e $file1 ]

 

举例:
if [ -x $a ]
then
echo ' 这个文件有执行权限'
else
echo ' 这个文件没有执行权限'
fi

 

 

 

 

 

6) shell 字符串

'' 硬转义 不能在里面使用$ 不能出现'' 不能出现转义符
"" 软转义 可以在里面使用变量 可以出现转义符

拼接字符串:

a='che'
b="hello $a"
echo $b

 

获取字符串的长度
a='chen'
b="hello $a"
echo ${#b}

 

提取子符串
a='chen'
b="hello $a"
echo ${b:6:4}

批量向文件里面写入多行数据

#!/bin/bash

cat >>1.txt <<EOF

[test]
name=this is my yum
enable=1
baseurl=file:///mnt
gpgcheck=0
EOF

 

 

7) shell 数组

一个变量,可以先定义多个数值

a=( 0 1 2 3 4 5 )
b=( aa bb cc dd ee )
echo ${a[3]}
echo ${b[3]}

或采用下面的定义方式
a[0]=aa
a[1]=bb

a=( 0 1 2 3 4 5 )
b=( aa bb cc dd ee )
echo ${a[3]}
echo ${b[3]}
echo ${a[*]} //获取数组的所有值
echo ${#a[*]} //获取数组的长度

 

 

 

[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

 

 

评论

  1. 黄兴
    Android Chrome
    7 年前
    2017-8-12 10:35:46

    总结得不错。很到位

    • yjh
      博主
      Windows Chrome
      7 年前
      2017-8-12 13:21:56

      谢谢~

本文评论已关闭
上一篇
下一篇