概述
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。 由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。
1 2 3 #!/bin/bash echo "Hello World!"
变量
详细请参照教程:Shell 变量 | 菜鸟教程
常用系统变量
作用域决定了变量能够影响到的是整个系统还是单个用户
$HOME
$PWD
$SHELL
$USER
…
运算
定义变量时无法对数值进行运算。
1 2 3 [root@ahost Desktop] [root@ahost Desktop] 1*2
只读变量 1 2 3 4 5 6 [root@ahost Desktop] [root@ahost Desktop] [root@ahost Desktop] rov1 [root@ahost Desktop] -bash: rov1: readonly variable
删除变量 1 2 3 4 5 6 7 8 [root@ahost Desktop] [root@ahost Desktop] hello [root@ahost Desktop] [root@ahost Desktop] [root@ahost Desktop]
且unset
不能删除只读变量。
自定义变量
使用变量时可用花括号标注变量名是$str
而非$strWorld
,从而避免意料外的情况。
1 2 3 4 5 str="Hello," echo "$strWorld !" echo "${str} World!"
变量名和等号之间不能有空格
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 **_**。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
特殊变量:$n $n
:其中 n 通常为 1-9 中的任意一个数字。
1 2 3 4 5 6 #!/bin/bash echo $1 echo $2 echo $3
1 2 3 4 [root@ahost Desktop] a b c
特殊变量:$ # $#
:获取所有输入参数的个数 。
1 2 3 4 5 6 7 8 9 #!/bin/bash echo $# echo $1 echo $2 echo $3
1 2 3 4 5 [root@ahost Desktop] 3 a b c
特殊变量:$* 和 $@ $*
:代表当前shell
中的所有参数,并将参数看作一个整体$@
:同$*
,但对参数
1 2 3 4 5 6 7 8 9 #!/bin/bash echo $# echo $1 echo $2 echo $3
特殊变量:$? $?
:最后一次执行的命令的返回状态,0
为命令被正确执行,反之。 执行正常:
1 2 3 4 [root@ahost Desktop]$ ls 1.txt 2.txt echo.sh helloworld.sh [root@ahost Desktop] 0
没有权限:
1 2 3 4 [java@ahost Desktop]$ cat /etc/shadow cat : /etc/shadow: Permission denied[java@ahost Desktop]$ echo $? 130
运算符 运算符的基本语法 “$((运算表达式))” or “$[运算表达式]” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash X=100 Y=20 A=$((X-Y)) echo $A B=$[X+Y] echo $B C=`expr $X / $Y ` echo $C D=$[(2+3)*5] echo $D expr `expr 2 + 3` \* 5
1 2 3 4 5 6 [root@ahost Desktop] 80 120 5 25 25
expr +,-,*,/,% 1 2 3 [root@ahost Desktop] [root@ahost Desktop] 8
条件判断 条件判断的基本语法 [ condition ]
(条件表达式前后需有空格) 注意:条件非空即为true
,[string]
返回true
,[]
返回false
。
常用判断条件
整数之间比较
语法
含义
=
字符串比较
-lt
小于(less than)
-le
小于等于(less equal)
-eq
等于(equal)
-gt
大于(greater than)
-ge
大于等于(greater equal)
-ne
不等于(Not equal)
按文件权限进行判断
语法
含义
-r
有读权限(read)
-w
有写权限(wrtie)
-x
有执行权限(execute)
按文件类型进行判断
语法
含义
-f
文件存在,并且是一个常规文件(file)
-e
文件存在(existence)
-d
文件存在,并且是一个目录(directory)
示例 1 2 3 4 5 6 7 #!/bin/bash [ $# -gt 2 ] && echo "参数个数大于 2" [ $# -le 2 ] || echo "参数个数大于 2--"
1 2 3 4 5 [root@ahost Desktop] [root@ahost Desktop] [root@ahost Desktop] 参数个数大于 2 参数个数大于 2--
1 2 3 4 5 [root@ahost Desktop] [root@ahost Desktop] 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@ahost Desktop] id hiyori &> /dev/null && echo "用户已存在" id hiyori &> /dev/null || useradd hiyori[root@ahost Desktop] [root@ahost Desktop] 用户已存在 [root@ahost Desktop] uid=1001(hiyori) gid=1001(hiyori) groups =1001(hiyori)
流程控制
结尾则以该语句的
if 判断 if 判断的基本语法 1 2 3 4 5 6 7 8 9 if [ 条件语句 ];then 代码... fi if [ 条件语句 ] then 代码... fi
注意事项 if [ ]
:if
与中括号之间需要用空格隔开,同理,中括号和条件语句之间也必须有空格;
if 判断的示例 1 2 3 4 5 6 7 8 9 #!/bin/bash if [ $1 -lt 18 ];then echo "未成年" elif [ $1 -ge 18 -a $1 -lt 30 ];then echo "是青年" else echo "中老年" fi
1 2 3 4 5 6 [root@ahost Desktop] 未成年 [root@ahost Desktop] 是青年 [root@ahost Desktop] 中老年
case 语句 case 语句的基本语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 case $变量名 in "值1" ) 代码1... ;; "值2" ) 代码2... ;; "值3" ) 代码3... ;; *) 当变量的值不符合上述分支时则执行此段代码... ;; esac
case 语句的注意事项
case 行尾必须是in
,每个分支则必须以右括号)
结束;
;;
表示命令序列结束,相当于break
;
*)
代表默认分支,等同于default
。
case 语句的示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash case $1 in "start" ) echo "输入的值为 start" ;; "stop" ) echo "输入的值为 stop" ;; "restart" ) echo "输入的值为 restart" ;; *) echo "其他内容" ;; esac
1 2 3 4 5 6 7 8 [root@ahost Desktop] 输入的值为 start [root@ahost Desktop] 输入的值为 restart [root@ahost Desktop] 输入的值为 stop [root@ahost Desktop] 其他内容
for 循环 for 循环的基本语法 1 2 3 4 5 6 7 8 9 10 for ((初始值;循环条件;临时变量))do 代码... done for ((初始值;循环条件;临时变量));do 代码... done
for 循环的扩展语法 1 2 3 4 5 6 7 8 9 for 变量 in 值1 值2 值3 ... do 代码... done for 变量 in 值1 值2 值3;do 代码... done
for 循环的示例 1 2 3 4 5 6 7 8 9 10 11 [root@ahost Desktop] for ((i=0;i<=100;i++));do sum =$[$sum +$i ] done echo "从1到100的和是:$sum " [root@ahost Desktop] 从1到100的和是:5050
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@ahost Desktop] for i in `seq 1 100`;do sum =$[$sum +$i ] done echo "从1到100的和为:$sum " [root@ahost Desktop] 从1到100的和为:5050
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@ahost Desktop] for i in `ls /` ;do echo $i done [root@ahost Desktop] bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
补充 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@ahost Desktop] for i in "$*" ;do echo "传入脚本的参数为:$i " done echo "----------------------------" for j in "$@ " ;do echo "传入脚本的参数为:$j " done [root@ahost Desktop] 传入脚本的参数为:abc def ---------------------------- 传入脚本的参数为:abc 传入脚本的参数为:def
while 循环 while 循环的基本语法 1 2 3 4 5 6 7 8 9 while [ 条件语句 ] do 代码... done while [ 条件语句 ];do 代码... done
while 循环的示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@ahost Desktop] i=1 sum =0while [ $i -le 100 ];do let sum =sum +i let i++ done echo "从1到100的和为:$sum " [root@ahost Desktop] 从1到100的和为:5050
while 循环更适合设定指定条件下的终止循环,也就是对循环流程的控制更为精细化。
读取控制台输入 read 命令 read 命令的基本语法
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数:指定读取值的变量名
read 命令的示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@ahost Desktop] read -p "请输入一个大于 1 的数字:" ni=1 sum =0while [ $i -le $n ];do let sum =sum +i let i++ done echo "从 1 到 $n 的和为 $sum " [root@ahost Desktop] 请输入一个大于 1 的数字:50 从 1 到 50 的和为 1275
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@ahost Desktop] read -t 5 -p "请在五秒内输入一个大于 1 的数字:" ni=1 sum =0while [ $i -le $n ];do let sum =sum +i let i++ done echo "从 1 到 $n 的和为 $sum " [root@ahost Desktop] 请在五秒内输入一个大于 1 的数字:read.sh: line 9: [: 1: unary operator expected 从 1 到 的和为 0
系统函数 basename basename 的基本语法 basename 的示例 1 2 [root@ahost Desktop] ifage
dirname dirname 的基本语法 dirname 的示例 1 2 [root@ahost Desktop] /home/root/Desktop
自定义函数 自定义函数的基本语法 1 2 3 4 5 6 7 [ function ] funname [()] { action; [return int;] } funname
经验技巧
必须在调用函数之前声明函数;
函数返回值只能通过$?
获取,且返回值必须是0-255的整数值。
自定义函数的示例 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash function sum (){ let s=$1 +$2 return $s } sum 10 200echo $?
1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash function sum (){ let s=$1 +$2 echo $s } result=`sum 100 200` echo $result
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #!/bin/bash if [ $# -ne 1 ];then echo "参数错误" exit 3 fi function jc (){ n=$1 if [ $n -le 1 ];then echo 1 return 0 elif [ $n -gt 1 ];then let pre_n=n-1 temp=`jc $pre_n ` let result=n*temp echo $result return 0 fi } jc $1
Shell 工具 cut cut 的基本语法
cut 的示例 1 2 3 4 5 6 7 8 9 10 [root@ahost Desktop] root:x:0:0:root bin:x:1:1:bin daemon:x:2:2:daemon adm:x:3:4:adm lp:x:4:7:lp sync :x:5:0:sync shutdown:x:6:0:shutdown ...
1 2 3 4 5 6 7 8 9 10 [root@ahost Desktop] root:/bin/bash bin:/sbin/nologin daemon:/sbin/nologin adm:/sbin/nologin lp:/sbin/nologin sync :/bin/syncshutdown:/sbin/shutdown ...
1 2 3 4 5 [root@ahost Desktop] root java hiyori
1 2 3 4 5 [root@ahost Desktop] /usr/local/soft/java/jdk1.8.0_40/bin:/usr/local/soft/java/jdk1.8.0_40/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@ahost Desktop] /usr/local/soft/java/jdk1.8.0_40/bin
sed
Linux sed 命令是利用脚本来处理文本文件。 sed 可依照脚本的指令来处理、编辑文本文件。 Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed 的基本语法
选项
作用
-e
同时指定多组命令
-i
将修改的内容直接作用到文件中
命令
作用
a
在 [n]a 行后新增内容
d
删除
s
查找替换
sed 的示例 1 2 3 4 5 6 7 8 [root@ahost Desktop] [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления Набросок на фрагменте экрана [root@ahost Desktop]
1 2 3 4 5 [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления
1 2 3 4 5 [root@ahost Desktop] Откыть центр уведомлрений Спасибо Набросок на фрагменте экрана
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления Набросок на фрагменте экрана Папа Мама Мама Папа Папа Папа Мама Мама [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления Набросок на фрагменте экрана Мама Мама Мама Мама Мама Папа Мама Мама [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления Набросок на фрагменте экрана Мама Мама Мама Мама Мама Мама Мама Мама
1 2 3 4 5 6 7 8 9 [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления Набросок на фрагменте экрана Мама Мама Мама Папа Мама Мама
awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
awk 的基本语法 1 awk [选项] '匹配模式1{命令1} 匹配模式2{命令2} ...' 文件名
awk 的内置变量
名称
含义
FILENAME
文件名
NR
已读的记录数
NF
浏览记录的域的个数(切割后,列的个数)
awk 的示例 1 2 3 4 5 6 7 8 9 [root@ahost Desktop] root,x bin,x daemon,x adm,x lp,x sync ,xshutdown,x
1 2 3 [root@ahost Desktop] hiyori, /bin/bash
1 2 3 4 5 6 7 8 9 10 11 12 [root@ahost Desktop] username | shell root | /bin/bash bin | /sbin/nologin daemon | /sbin/nologin adm | /sbin/nologin lp | /sbin/nologin sync | /bin/syncshutdown | /sbin/shutdown ... End
sort
Linux sort 命令用于将文本文件内容加以排序。 sort 可针对文本文件的内容,以行为单位来排序。
Linux sort 命令
sort 的基本语法
sort 的示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root@ahost Desktop] Мама Мама Мама Папа Набросок на фрагменте экрана Откыть центр уведомлрений Очистить уведомления Папа Мама Папа Папа Спасибо [root@ahost Desktop] Спасибо Папа Мама Мама Мама Набросок на фрагменте экрана Мама Папа Папа Папа Очистить уведомления Откыть центр уведомлрений [root@ahost Desktop] Откыть центр уведомлрений Спасибо Очистить уведомления Набросок на фрагменте экрана Папа Мама Мама Папа Папа Папа Мама Мама
拓展 Shell 输入/输出重定向 Shell 文件包含