shell入门-xdclass

2020年12月7日14:06:08

01 30个linux的基本操作命令

  1. cd

功能说明:切换目录。

举例:切换到根目录:cd /

  1. ls

功能说明:列出目录内容。

举例:列出/var目录的文件和目录的信息:ls –l /var;最常用方式ls –lrt

  1. cat

功能说明:查看小文件内容。

举例:查看test.txt文件内容:cat test.txt

  1. chmod

功能说明:修改文件或目录权限。

举例:修改test.sh为自己可执行:chmod u+x test.sh

  1. chown
    功能说明:变更文件或目录的拥有者或所属群组。

举例:修改test.txt属主为mysql:chown mysql:mysql test.txt

  1. cp

功能说明:拷贝文件。

举例:拷贝文件test.sh为test.sh_bak:cp test.sh test.sh_bak

  1. diff

功能说明:对比文件差异。

举例:对比文件test.sh test.sh_bak 是否有差异diff test.sh test.sh_bak

  1. find

功能说明:查询文件。

举例:查询根目录下面的test.txt:find ./ -name test.txt;查询当前目录:find . -name test.txt;

  1. mv

功能说明:移动或更名现有的文件或目录。

举例:移动test.sh到/bin目录下:mv test.sh /bin/

  1. rm

功能说明:删除文件或目录。

举例:删除文件test.sh:rm test.sh

  1. touch

功能说明:创建一个空文件。

举例:创建一个空的test.txt文件:touch test.txt

  1. which

功能说明:在环境变量$PATH设置的目录里查找符合条件的文件。

举例:查询find命令在那个目录下面:which find

  1. ssh

功能说明:远程安全登录方式。

举例:登录到远程主机:ssh ${IP}

  1. grep

功能说明:查找文件里符合条件的字符串。

举例:从test.txt文件中查询test的内容:grep test test.txt

  1. wc

功能说明:统计行。

举例:统计test.txt文件有多少行:wc -l test.txt

  1. date

功能说明:查询主机当前时间。

举例:查询主机当前时间:date

  1. exit

功能说明:退出命令。

举例:退出主机登录:exit

  1. kill

功能说明:杀进程。

举例:杀掉test用户下面的所有进程:ps -ef | awk ‘$1==”test” {print $2}’ | xargs
kill -9

  1. id命令

功能说明:查看用户。

举例:查看当前用户:id ;查询主机是否有test用户:id test

  1. ps

功能说明:查询进程情况。

举例:查询test.sh进程:ps -ef | grep test.sh

  1. sleep

功能说明:休眠时间。

举例:休眠60秒:sleep 60

  1. uname

功能说明:查询主机信息。

举例:查询主机信息:uname -a

  1. passwd

功能说明:修改用户密码。

举例:使用root修改test用户的密码:passwd test

  1. ping

功能说明:查看网络是否通。

举例:查询本主机到远程IP的网络是否通:ping ${IP}

  1. df

功能说明:查看磁盘空间使用情况。

举例:查看主机的空间使用情况:df -h

  1. echo

功能说明:标准输出命令。

举例:对变量test进行输出:echo $test

  1. pwd

功能说明:查询所在目录。

举例:查询当前所在目录:pwd

  1. head命令

功能说明:查看文件的前面N行。

举例:查看test.txt的前10行:head -10 test.txt

  1. tail

功能说明:查看文件的后面N行。

举例:查看test.txt的后10行:tail -10 test.txt

  1. 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 $a - $b
    • echo $[12 - 6] echo $[a - b]
    • echo $((12 - 6)) echo $((a - b))
    • expr 12 * 6 expr $a \* $b
    • echo $[12 * 6] echo $[a * b]
    • echo $((12 * 6)) echo $((a * b))
    • expr 12 / 6 expr $a / $b
    • echo $((12 / 6)) echo $((a / b))
    • echo $[12 / 6] echo $[a / b]
  • 求余
    • expr 12 % 6 expr $a % $b
    • echo $((12 % 6)) echo $((a % b))
    • echo $[12 % 6] echo $[a % b]

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
  • -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:代表不可以登录的用户)

(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}'
  • -F:指定分割符

    • eg:cat /etc/passwd | awk -F":" '{print $1}'
  • 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"}'
  • NR:行号

    • eg:df -h | awk 'NR==6 {print $5}'

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

(4) sed命令

sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)

sed语法:sed [选项]....[动作]....文件名

常见的选项与参数:

  • -n:把匹配到的行输出打印到屏幕
  • p:以行为单位进行查询,通常与-n一起使用
    • eg:df -h | sed -n '2p'

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

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

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

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

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

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

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

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

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}
posted @ 2020-12-07 23:09  ddhhdd  阅读(413)  评论(0)    收藏  举报