shell入门-xdclass
2020年12月7日14:06:08
01 30个linux的基本操作命令
- cd
功能说明:切换目录。
举例:切换到根目录:cd /
- ls
功能说明:列出目录内容。
举例:列出/var目录的文件和目录的信息:ls –l /var;最常用方式ls –lrt
- cat
功能说明:查看小文件内容。
举例:查看test.txt文件内容:cat test.txt
- chmod
功能说明:修改文件或目录权限。
举例:修改test.sh为自己可执行:chmod u+x test.sh
- chown
功能说明:变更文件或目录的拥有者或所属群组。
举例:修改test.txt属主为mysql:chown mysql:mysql test.txt
- cp
功能说明:拷贝文件。
举例:拷贝文件test.sh为test.sh_bak:cp test.sh test.sh_bak
- diff
功能说明:对比文件差异。
举例:对比文件test.sh test.sh_bak 是否有差异diff test.sh test.sh_bak
- find
功能说明:查询文件。
举例:查询根目录下面的test.txt:find ./ -name test.txt;查询当前目录:find . -name test.txt;
- mv
功能说明:移动或更名现有的文件或目录。
举例:移动test.sh到/bin目录下:mv test.sh /bin/
- rm
功能说明:删除文件或目录。
举例:删除文件test.sh:rm test.sh
- touch
功能说明:创建一个空文件。
举例:创建一个空的test.txt文件:touch test.txt
- which
功能说明:在环境变量$PATH设置的目录里查找符合条件的文件。
举例:查询find命令在那个目录下面:which find
- ssh
功能说明:远程安全登录方式。
举例:登录到远程主机:ssh ${IP}
- grep
功能说明:查找文件里符合条件的字符串。
举例:从test.txt文件中查询test的内容:grep test test.txt
- wc
功能说明:统计行。
举例:统计test.txt文件有多少行:wc -l test.txt
- date
功能说明:查询主机当前时间。
举例:查询主机当前时间:date
- exit
功能说明:退出命令。
举例:退出主机登录:exit
- kill
功能说明:杀进程。
举例:杀掉test用户下面的所有进程:ps -ef | awk ‘$1==”test” {print $2}’ | xargs
kill -9
- id命令
功能说明:查看用户。
举例:查看当前用户:id ;查询主机是否有test用户:id test
- ps
功能说明:查询进程情况。
举例:查询test.sh进程:ps -ef | grep test.sh
- sleep
功能说明:休眠时间。
举例:休眠60秒:sleep 60
- uname
功能说明:查询主机信息。
举例:查询主机信息:uname -a
- passwd
功能说明:修改用户密码。
举例:使用root修改test用户的密码:passwd test
- ping
功能说明:查看网络是否通。
举例:查询本主机到远程IP的网络是否通:ping ${IP}
- df
功能说明:查看磁盘空间使用情况。
举例:查看主机的空间使用情况:df -h
- echo
功能说明:标准输出命令。
举例:对变量test进行输出:echo $test
- pwd
功能说明:查询所在目录。
举例:查询当前所在目录:pwd
- head命令
功能说明:查看文件的前面N行。
举例:查看test.txt的前10行:head -10 test.txt
- tail
功能说明:查看文件的后面N行。
举例:查看test.txt的后10行:tail -10 test.txt
- mkdir
功能说明:创建目录。
举例:创建test目录:mkdir test
02 shell的使用技巧
(1) 常见的解释器
解释器:是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行
#!/bin/bash(默认)
#!/bin/ksh
#!/bin/bsh
#!/bin/sh
注意:面试官,shell一定得有解释器吗?
答案:不一定
(2) shell脚本文件权限与脚本执行
文件权限:- rw- r-- r--
目录权限:d rw- r-- r--
分三列:每三个为一列,分别是所有者(owner),所属组(group),其他(others)
rwx r:4 w:2 x:1
7 5 5
执行方法:
方法1:添加执行权限,并执行脚本
chmod +x shell.sh
./shell.sh
方法2:sh shell.sh 或者 bash shell.sh
方法3:source shell.sh
03 shell的变量以及常见符号
(1) 常见变量
不同于其它语言需要先声明变量,shell的变量直接使用,eg: a=15
调用变量的话$a或者${a};
a=10
echo $a 或 echo ${a}
# ${a}是为了和其他字符进行区分,例如
a=b
echo ${a}ook
# 输出:book
$?:判断上一条命令执行的是否成功(0表示执行成功,其他则失败)$0:返回脚本的文件名称$1-$9:返回对应的参数值$*:返回所有的参数值是什么$#:返回参数的个数和
(2) 常见的几个符号
>:会覆盖原有的内容,eg:cat > shell.sh>>:不会覆盖原有的内容,eg:cat >> shell.sh;:执行多条命令,eg:cat shell.sh ; ls|:管道符&&:前面的命令执行成功,后面的才可以执行||:前面的命令执行失败,后面的才可以执行"":会输出变量值'':输出本身

- ``:输出命令结果

2>/dev/null:错误输出到无底洞1>/dev/null:正确输出到无底洞

(3) 运算符
3.1) 整数
- 加
- expr 12 + 6
expr $a + $b(加号两边一定要有空格) - echo $[12 + 6]
echo $[a + b](为了统一,加号两边建议加空格) - echo $((12 + 6))
echo $((a + b))
- expr 12 + 6
- 减
- expr 12 - 6
expr $a - $b - echo $[12 - 6]
echo $[a - b] - echo $((12 - 6))
echo $((a - b))
- expr 12 - 6
- 乘
- expr 12 * 6 expr
$a \* $b - echo $[12 * 6]
echo $[a * b] - echo $((12 * 6))
echo $((a * b))
- expr 12 * 6 expr
- 除
- expr 12 / 6 expr
$a / $b - echo $((12 / 6))
echo $((a / b)) - echo $[12 / 6]
echo $[a / b]
- expr 12 / 6 expr
- 求余
- expr 12 % 6 expr
$a % $b - echo $((12 % 6))
echo $((a % b)) - echo $[12 % 6]
echo $[a % b]
- expr 12 % 6 expr
3.2) 小数
- bc计算器
保留多少位小数可以通过scale,但是scale只对除法,取余数,乘幂 有效,对加减没有效。
echo "scale=2;(0.2+0.3)/1" | bc #计算出0.2+0.3的和并保留两位小数,此时bc计算器会省略掉个位数的0
echo "scale=2;(1.2+1.3)/1" | bc #计算出1.2+1.3的和并保留两位小数
(4) 常见的条件判断
(1) 语法:
[ 判断表达式 ]- (注意:两边都必须要有空格)
(2) 文件(夹)或者路径:
-e:目标是否存在(exist)-d:是否为路径(directory)-f:是否为文件(file)
[ -e foer.sh ] || touch foer.sh #判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh
文件;
(3) 权限:
-r:是否有读取权限(read)-w:是否有写入权限(write)-x:是否有执行权限(excute)
[ -x 123.txt ] && echo '有执行权限'
(4) 整数值(int型):
-eq:等于(equal)-ne:不等于(not equal)-gt:大于(greater than)-lt:小于(lesser than)-ge:大于或者等于(greater or equal)-le:小于或者等于(lesser or equal)
[ 9 -gt 8 ] && echo '大于'
(5) 小数(浮点型):
[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo '小于'
(6) 字符串:
=:相等!=:不相等
[ 'kkkkk' != 'kkkk' ] && echo '不等于'
(7) 简单脚本案例:
#!/bin/bash
#判断输入第一个数是否大于第二个数
#by dawson
if [ $1 -gt $2 ]
then
echo "$1大于$2"
else
echo "$1小于$2"
fi
#!/bin/bash
touch $1
if [ $? -eq 0 ];then
echo "创建成功"
04 shell脚本的输入输出
(1) shell脚本输入之read命令
语法:read -参数
-p:给出提示符。默认不支持"\n"换行-s:隐藏输入的内容(一定要加在-p的前面)-t:给出等待的时间,超时会退出read-n:限制读取字符的个数,触发到临界值会自动执行
#!/bin/bash
read -p "请输入密码:" pwd
echo $pwd
(2) shell脚本输出上色
语法:echo -e "\033[字背景颜色;字体颜色;特效字符串\033[关闭属性"
- 字体色范围:30-37
echo -e "\033[30m 黑色字 \033[0m"echo -e "\033[31m 红色字 \033[0m"echo -e "\033[32m 绿色字 \033[0m"echo -e "\033[33m 黄色字 \033[0m"echo -e "\033[34m 蓝色字 \033[0m"echo -e "\033[35m 紫色字 \033[0m"echo -e "\033[36m 天蓝字 \033[0m"echo -e "\033[37m 白色字 \033[0m"
- 字背景颜色范围:40-47
echo -e "\033[40;37m 黑底白字 \033[0m"echo -e "\033[41;30m 红底黑字 \033[0m"echo -e "\033[42;34m 绿底蓝字 \033[0m"echo -e "\033[43;34m 黄底蓝字 \033[0m"echo -e "\033[44;30m 蓝底黑字 \033[0m"echo -e "\033[45;30m 紫底黑字 \033[0m"echo -e "\033[46;30m 天蓝底黑字 \033[0m"echo -e "\033[47;34m 白底蓝字 \033[0m"
- 特效范围
echo -e "\033[0m 无任何特效 \033[0m"echo -e "\033[1m 高亮度 \033[0m"echo -e "\033[4m 下划线 \033[0m"echo -e "\033[5m 闪烁 \033[0m"
#!/bin/bash
read -p "`echo -e "\033[31;5m 请输入密码:\033[0m"`" pwd
echo $pwd
05 处理海量数据的grep、cut、awk、sed 命令
grep、cut、awk、sed常常应用在查找日志、数据、输出结果等等,并对我们想要的数据进行提取,通常grep,sed命令是对行进行提取,cut跟awk是对列进行提取。
(1) grep命令
grep应用场景:通常对数据进行行的提取
语法:grep [选项]...[内容]...[file]
-v:对内容进行取反提取-n:对提取的内容显示行号-w:精确匹配-i:忽略大小写^:匹配开头行首-E:正则匹配
grep -in ^dawson /etc/passwd
(2) cut命令
cut应用场景:通常对数据进行列的提取
语法:cut [选项]...[file]
-
-d:指定分割符 -
-f:指定截取区域 -
-c:以字符为单位进行分割 -
注意:不加-d选项,默认为制表符(tab),不是空格
-
-d与-f:- eg:以':'为分隔符,截取出/etc/passwd的第一列跟第三列
cut -d ':' -f 1,3 /etc/passwd - eg:以':'为分隔符,截取出/etc/passwd的第一列到第三列
cut -d ':' -f 1-3 /etc/passwd - eg:以':'为分隔符,截取出/etc/passwd的第二列到最后一列
cut -d ':' -f 2- /etc/passwd
- eg:以':'为分隔符,截取出/etc/passwd的第一列跟第三列
-
-c:- eg:截取/etc/passwd文件从第二个字符到第九个字符
cut -c 2-9 /etc/passwd - eg:比如领导想叫你截取linux上面所有可登陆普通用户
grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v root(/bin/bash:代表可以登录的用户;
/sbin/nologin:代表不可以登录的用户)
- eg:截取/etc/passwd文件从第二个字符到第九个字符
(3) awk命令
awk的简介:其实是一门编程语言,支持条件判断,数组,循环等功能,awk与grep,sed被称为linux三剑客,之所以叫awk是因为取其三位创始人Alfred Aho,Peter Weinberger和Brian Kernighan的Family Name的首字符。
awk的应用场景:通常对数据进行列的提取。
语法:awk '条件 {执行动作}' 文件名
awk '条件1 {执行动作} 条件2 {执行动作} ...' 文件名
或awk [选项] '条件1 {执行动作} 条件2 {执行动作} ...' 文件名
特殊要点与举例说明:
-
printf:格式化输出,不会自动换行。
-
%ns:字符串型,n代表有多少个字符;(n省略则默认为1) -
%ni:整型,n代表输出几个数字; -
%.nf:浮点型,n代表的是小数点后有多少个小数 -
print:打印出内容,默认会自动换行。
-
\t:制表符 -
\n:换行符
eg:printf '%s\t%s\t%s\t%s\t%s\t%s\n' 1 2 3 4 5 6 7 8

eg:df -h | grep /dev/vda1 | awk '{printf "/dev/vda1的使用率是:"} {print $5 }'(awk后面接了两个执行动作)

eg:echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n", $0}'

-
$1:代表第一列 -
$2:代表第二列 -
$0:代表一整行- eg:
df -h | grep /dev/vda1 | awk '{print $5}'
- eg:
-
-F:指定分割符- eg:
cat /etc/passwd | awk -F":" '{print $1}'
- eg:
-
BEGIN:在读取所有行内容前就开始执行,常常被用于修改内置变量的值FS:BEGIN时定义分割符- eg:
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'(执行结果同上)
-
END:结束的时候执行- eg:
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1} END {printf "执行成功\n"}'
- eg:
-
NR:行号- eg:
df -h | awk 'NR==6 {print $5}'
- eg:

-
- eg:
df -h | awk '(NR >= 2 && NR <=6) {print $5}'
- eg:

(4) sed命令
sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)
sed语法:sed [选项]....[动作]....文件名
常见的选项与参数:
-n:把匹配到的行输出打印到屏幕p:以行为单位进行查询,通常与-n一起使用- eg:
df -h | sed -n '2p'
- eg:

d:删除 (不会修改源文件)- eg:
sed '2d' df.txt
- eg:

a:在行的下面插入新的内容 (不会修改源文件)- eg:
sed '2a 1234567890' df.txt
- eg:

i:在行的上面插入新的内容 (不会修改源文件)- eg:
sed '2i 1234567890' df.txt
- eg:

c:替换 (不会修改源文件)- eg:
sed '2c 1234567890' df.txt
- eg:

s/要被取代的内容/新的字符串/g:指定内容进行替换- eg:
sed 's/0%/100%/g' df.txt
- eg:

-i:对源文件进行修改 (高危操作,慎用,用之前需要备份源文件)

- 搜索:在文件中搜索内容
- eg:
cat -n df.txt | sed -n '/100%/p'
- eg:

-e:表示可以执行多条动作- eg:
cat -n df.txt | sed -n -e 's/100%/100%-----100%/g' -e '/100%-----100%/p'
- eg:

06 判断/循环控制语句
(1) if判断
# 单分支循环(如下分号可以省略)
if [ 条件判断 ];
then
执行动作
fi
if [ 条件判断 ];
then
执行动作
else
执行动作
fi
# 多分支循环
if [条件判断];
then
执行动作
elif [条件判断];
then
执行动作
elif [条件判断];
then
执行动作
fi
(2) for循环
# (1)
for 变量名 in 值1 值2 值3
do
执行动作
done
# (2)
for 变量名 in `命令`
do
执行动作
done
# (3)
for ((条件))
do
执行动作
done
(3) case判断
case 变量 in
值1 )
执行动作1
;;
值2 )
执行动作2
;;
值3 )
执行动作3
;;
....
esac
(4) while循环
while [ 条件判断式 ]
do
执行动作
done
07 实战案例
(1) 实现可选择性执行的功能
#!/bin/bash
#功能选项
while [ 1 ]
do
cat <<EOF
*************************************************************
* 1、算出你输入的目录下一共有多少文件 eg:/data *
* 2、计算从0加到你输入的数字为止 eg:0+1+2+...+你输入的数字 *
* 3、批量创建用户 *
* 4、测试用户名和密码是否匹配 *
* 5、测试ip通不通 *
* 6、巡检内存使用率 *
* 7、数据库里查询学生成绩 *
* q、退出 *
*************************************************************
EOF
echo '输入你想要的功能:'
read key
case $key in
1 )
clear
sh 1.sh
;;
2 )
clear
sh 2.sh
;;
3 )
clear
sh 3.sh
;;
4 )
clear
sh 4.sh
;;
5 )
clear
sh 5.sh
;;
6 )
clear
sh 6.sh
;;
7 )
clear
sh 7.sh
;;
q )
clear
echo '感谢使用,程序退出!'
;;
esac
done
(2) 巡检内存使用率
#!/bin/bash
# 内存使用率
men_total=`free -m | sed -n '2p' | awk '{print $2}'`
men_used=`free -m | sed -n '2p' | awk '{print $3}'`
men_free=`free -m | sed -n '2p' | awk '{print $4}'`
Percent_men_used=`echo "scale=3; $men_used / $men_total * 100" | bc`
Percent_men_free=`echo "scale=3; $men_free / $men_total * 100" | bc`
now_time=`date +"%Y-%m-%d %H:%M:%S 星期%w"`
echo -e "\n"
echo -e "$now_time\n内存使用率是:$Percent_men_used%"
echo -e "内存还剩:$Percent_men_free%未使用"
# 检查负载是否有压力
if [ $men_used -gt 1 ]
then
echo -e "\033[31;5m内存使用率已超过负载能力,目前使用率达到:$Percent_men_used% \033[0m"
else
echo '目前内存负载正常'
fi
echo -e "\n"
(3) 批量创建用户
#!/bin/bash
# 批量创建用户
read -p '请输入创建的用户名称:' name
read -p '请输入创建用户的数量:' number
for (( i=1;i<=$number;i++ ))
do
# 需要查看系统是否存在用户
cat /etc/passwd | grep "${name}$i" 1>/dev/null
exist=`echo $?`
if [ $exist -eq 1 ]
then
# 创建用户
echo -e "\n"
useradd ${name}$i 2>/dev/null && echo "创建用户${name}$i成功!"
# 给新用户设置密码并把用户名跟密码放在文本中
# 需要生成随机密码(md5值)
password=`head -2 /dev/urandom | md5sum | cut -c 1-8`
echo $password | passwd --stdin ${name}$i 1>/dev/null && echo -e "用户名:${name}$i\t$password" >>/usr/local/shell_test/user_pwd.txt
echo -e "\n"
else
echo "${name}$i已经存在了,无需再创建!"
echo -e "\n"
fi
done
(4) 查询数据库
#!/bin/bash
# 数据库查询
read -p '请输入你要查询的用户:' name
read -s -p '请输入数据库用户:' user
echo -e "\n"
#read -s -p '请输入数据库密码:' password
sql="select * from xdclass.test where username='${name}';"
#-e是进入非交互界面
mysql -u${user} -p -e "${sql}"
exit
(5) 登录别的机器
#!/bin/bash
# 登录ip
RegionIP=`cat /usr/local/shell_test/ip.txt | grep "$1" | awk -F "|" '{print $2}'`
ssh ${RegionIP}

浙公网安备 33010602011771号