Shell: 命令解释器
Shell 把命令发送给Linux内核,Linux调用底层的系统硬件,然后把结果返回
Shell 常用操作功能
Tab键自动补齐
查看历史命令:
history
!n 执行历史记录中第n条命令
!str 执行历史记录中以“str”开头的命令
命令别名:
alias ddd='df -Th' ddd是别名,df -Th是执行的命令
unalias 别名 取消已经设置的命令别名
可以把使用频率高的复杂命令设置简短的别名放在 ~/.bashrc
输出重定向:
重定向标准输入:操作符 < ,将命令中接收输入的途径由默认的键盘更改为指定的文件
重定向标准输出:操作符 > ,将命令的执行结果输出到指定的文件中,而不是显示在屏幕
操作符 >> ,将命令执行的结果追加输出到指定文件
重定向标准错误:操作符 2> ,清空指定文件的内容,并将标准错误信息保存到改文件中
操作符 2>> ,将标准错误信息追加输出到指定的文件中
重定向标准输出和标准错误: 操作符 &> , 将标准输出、标准错误的内容全部保存到指定的文件中
1> 正确的输出 2>正确的输出
ls >> root.txt
ls / >> root.txt
ifconfig > net.txt
ifconfig 1> net.txt
13131 2> test.txt 把执行命令的错误结果存放到test.txt
管道操作: 管道操作符: " | "
把 " | " 前面的数据 给 " | " 后面的数据加工操作
free -m
free -m |grep mem 查找(帅选)包含 mem的项
free -m |grep -i mem -i表示忽略大小写
free -m |grep -i mem | awk '{print $4}' 找到包含mem的项,用awk命令打印出第四列的数据
free -m |grep -i mem | awk '{print $4,$2}'
----------------------------
查看文件属性
ls -l file
权限类型
rwx 读,写,执行
-(- 代表普通文件,d 目录文件)rw-rw-r-- 1 ubuntuserver(创造文件的所有者) ubuntuserver(所属组) 115 Mar 16 02:08 test.txt
rw-rw-r-- 三种人群(所有者(ubuntuserver用户),所属组(ubuntuserver组内的用户),其他用户(ubuntuserver以外的用户))的权限
Linux 的用户: 所有者(u),所属组(g),其他用户(o) ,所有用户(a)
查看用户
id 查看用户
id 用户名
用户添加 useradd 用户名
用户删除 userdel -r 用户名
把用户加入组 gpasswd -a 用户名 组名
把组中用户删除 gpasswd -d 用户名 组名
权限:
(1) chmod
chmod 用户+权限 文件名字
chmod o+w text.txt 增加文件的other用户的写权限
chmod o-w text.txt 减少文件的other用户的写权限
chmod (3个)数字(对应所有者,所属组,其他用户的权限) 文件名字
权限对应的数字 r 4 , w 2 , x 1
chmod 755 file 755 rwx r-x r-x
(2) acl授权
设置权限 setfacl -m u:用户名:权限(rwx) test.txt
查看权限 getfacl test.txt
删除user1在 test.txt上的权限 setfacl -x u:user1 test.txt
删除/test上的所有acl权限 setfacl -b test.txt
设置acl的默认权限 setfacl -m d:u:user1:rwx test
当前目录的子目录会继承目录的acl权限
对目录以及子目录和文件设置 acl权限 setfacl -m u:user:rwx -R /mnt/
--------------------------------
Shell脚本: 包含多条Linux命令的普通文本文件
脚本文件中包含的内容:
运行环境设置: #!/bin/bash
注释信息:以#开始的说明性文字
可以执行的Linux命令行
执行脚本的方式 bash ./test1.sh sh ./test1.sh
或者 先添加权限 chmod a+x test1.sh ,然后 ./test1.sh
简单shell脚本例子1
#!/bin/bash
echo '输出...'
echo #空一行
df -Th
cho
#时间输出到指定文件,文件可以不存在
date >> Log.log
--------------------------
Shell变量的种类
用户自定义变量: 由用户自己定义
预定义变量: Bash预定义的特殊变量,不能直接修改
位置变量: 通过命令行给程序传递执行参数
定义新的变量: 变量名=变量值
查看变量的值: echo $变量名
通过$ 符号引用指定名称的变量值
name="user1"
echo "my name is $name" 结果: my name is user1
echo "my name is ${name}fg" 结果: echo "my name is user1fg"
从键盘输入内容为变量赋值: read -p "信息" 变量名
read -p "请输入名字:" name
不同引用操作变量
双引号"" : 允许通过$符号引用变量值,
echo "my name is $name" 如果用单引号无法解析name的值
单引号'' :禁止引用变量,$视为普通符号,不能解析转义字符
反撇号`` : 将命令执行的结果输出变量
str=`echo 123`
echo $str
清除用户定义的变量: unset 变量名
位置变量:
表示为$n,n为1~9之间的数字
#test.sh
echo $1
echo $2
echo $3
echo $4
执行的时候,把外部的参数传递给脚本 ./test.sh a b c d
脚本内的$1,$2,$3, $,4 会接收到参数
case $1 in
start)
echo 'start...'
;;
stop)
echo 'stop...'
;;
esac
两个数之和的运算 echo $(($1+$2)) 或者 expr 10 + 20 加号左右要有空格
预定义变量:
$# 命令行中位置参数的个数
$* 所有位置参数的内容
$? 上一条命令执行后返回的状态,当返回状态为0表示执行正常,非0值表示执行异常或者出错
$0 当前执行的进程/程序名
for i in $* ; do
echo $i
sleep 1
done
tot=0
for i in $* ; do
tot=$(($tot+$i))
done
echo $tot
ls -l
echo $?
if [[ $?==0 ]]; then
echo '上条命令执行成功'
else
echo '上条命令执行失败'
fi
计算整数表达式的运算结果 expr 变量1 运算符 变量2 ...[运算符 变量n]
运算符:
加法 +
减法 -
乘法 \*
除法 /
求模(取余)运算 %
num=`expr 2 + 3 + 4`
num=`expr 2 /* 4` # *要转义
num=$((2*4)) # 这种形式不用转义*
echo $num
----------------------------
echo -e "myname \n abc" # -e 可以解析转义字符
echo -n "Input your name" # -n 输出的内容不换行
read name # 从键盘输入的值 赋值给变量name
echo $name
echo #echo单独一行,可以输出空行
echo -e "\033[32;40m [test] \033[0m" #输出 [test] 带有背景颜色和字体颜色
echo -e "process \033[32;40m succuess \033[0m"
echo -e "process\033[32;40msuccuess\033[0m"
\033[前景颜色;背景颜色m
\033[0m 0 代表恢复到系统默认的颜色,如果没有\033[0m这个结尾,系统的字体颜色会被改变
字体颜色:
30 黑色前景
31 红色前景
32 绿色前景
33 棕色前景
34 蓝色前景
35 紫色前景
36 青色前景
37 白色前景
背景颜色:
40 黑色前景
41 红色前景
42 绿色前景
43 棕色前景
44 蓝色前景
45 紫色前景
46 青色前景
47 白色前景
cat<<x # x可以是任意字符,从x开始输出直到遇到x标记
abdaaaaaaa
x
把执行的结果保存到文件
./test.sh | tee menu.txt
查看文件带行号
cat Log.log|nl
----------------------------------
测试命令: 测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式: 测试命令 条件表达式 [ 测试命令 条件表达式 ]
常见测试类型
测试文件状态
字符串比较
整数值比较
逻辑测试
测试文件状态 [ 操作符 文件或者目录 ] 注意中括号左右两边有空格
常用的测试操作符
-d 测试是否为目录(Directory)
-e 测试目录或文件是否存在(Exist)
-f 测试是否为文件(File)
-r 测试当前用户是否有权限读取(read)
-w 测试当前用户是否有权限写入(write)
-x 测试当前用户是否有权限执行(execute)
-L 测试是否为符号连接文件(Link)
例子:
[ -d a.test ]
echo $? # $? 得到返回的状态,非0是异常的
if [ -e ./file1 ]
then
echo "file is exist!"
else
echo "file is not exist!"
touch file1 # 创建文件
fi
整数值比较 [ 整数1 操作符 整数2 ]
常用测试操作符:
-eq 等于(Equal)
-ne 不等于(Not equal)
-gt 大于(Greater than)
-lt 小于(Less than)
-le 小于或等于(Lesser or Equal)
-ge 大于或等于(Greater or Equal)
age=20
if [ $age -gt 18 ]
then
echo "greater"
else
echo "lesser"
fi
字符串比较:
[ 字符串1 = 字符串2 ] 注意 等号的前后有空格
[ 字符串1 != 字符串2 ]
[ -z 字符串 ] 字符串内容为空
例子:
read -p 'name:' name
read -p 'pass:' pass
if [ $name = 'admin' ] && [ $pass = '123' ]
then
echo '成功'
else
echo '失败'
fi
逻辑测试
[ 表达式 ] 操作符 [ 表达式2 ] ...
常用测试操作符
-a或&& 逻辑与,前后两个表达式都成立时,整个结果为真,否则为假
-o或|| 逻辑或, 操作符两边至少有一个真,结果为真
! 逻辑否 :当指定的条件不成立时,返回结果为真
ls && echo 'yes'
--------------------------------
score=87
if [ $score -lt 60 ];then
echo '60分以下'
elif [ $score -ge 60 ] && [ $score -lt 70 ];then
echo '60-70之间'
elif [ $score -ge 70 ];then
echo '大于70'
fi
#week=1
week= `date +%w`
case $week in
1)
echo '一'
;;
2)
echo '二'
;;
3)
echo '三'
;;
*)
echo '其他'
esac
sex='男'
case $sex in
'男')
echo '性别为男'
;;
'女')
echo '性别为女'
;;
*)
echo '不存在'
esac
num=10
while [ $num -gt 0 ]
do
if [ $(($num%2)) -eq 0 ];then
echo $num
else
echo -e "\033[37;40m ${num}\033[0m"
fi
num=$(($num-1))
done
#for循环
for i in user0 user1 user2
do
echo $i
done
#把文件每行输出
for i in `cat user.txt`
do
echo $i
done
#cat /etc/passwd|awk -F: '{print $1}' 返回文件第一个列
for i in `cat /etc/passwd|awk -F: '{print $1}'`
do
echo $i>>user.txt
done
#------
for((i=0;i<10;i++))
do
echo $i
if [ $i -eq 5 ];then
break
fi
done
for((i=0;i<10;i++))
do
if [ $i -eq 5 ];then
continue
fi
echo $i
done
#----
read -p 'please press one key: ' key
case $key in
[a-z]|[A-Z])
echo '字母键!'
;;
[0-9])
echo '数字键'
;;
*)
echo '功能键'
;;
esac
-------
Shift 用于迁移位置变量,把输入的位置变量$1~$9一次从左迁移,
执行一次shift,总的位置变量会少一个
tot=0
while [ $# -gt 0 ]
do
tot=$(($tot+$1))
shift
done
echo $tot
-------------
函数
function 函数名() {
命令序列
}
function 函数名{
命令序列
}
调用已定义的函数
函数名
向函数内传递参数
函数名 参数1 参数2 ...
例子
function add()
{
num=$1
tot=0
for((i=1;i<$num;i++))
do
tot=$(($tot+$i))
done
# return $tot
echo $tot
}
add 10 #调用
add 200
#-----------
function add2()
{
echo $(($1+$2))
}
add 10 20
-----------------------------
awk
# $0 代表整行
awk '{print $0}' access.log #查找文件的每一行
# -F 分割的意思 -F: 以冒号作为分割符 ,默认分割符是空格
# 返回第一列,第二列,第三列
cat /etc/passwd | awk -F: '{print $1,$2,$3}'
cat /etc/passwd | awk -F: '{print $1" => "$2 "=>" $3}'
#打印df命令结果的第三行 NR(number row) 行数
df|awk '{if(NR==3){print}}'
df|awk '{if(NR==3){print $1}}'
#字符串结果转整型
df|awk '{if(NR==3){print int($3)}}'