Shell
shell既是一种命令语言,又是一种程序设计语言
Shell脚本(shell script)是一种为shell编程的脚本程序,而不是指开发shell自身
Shell环境
Shell编程需要脚本解释器,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
脚本文件中使用 #! 告诉系统 后边指定的程序就是解释这个脚本文件的shell程序
通过 cat 命令来查看当前 Linux 系统的可用 Shell:
$ cat /etc/shells
运行Shell脚本
简单shell脚本例子
用vim 写个test.sh(扩展名不影响脚本执行)
#!/bin/bash
echo "Hello World !"
运行
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
也可以直接使用解释器运行
/bin/bash test.sh
以后台的方式运行
./test.sh &
定时任务
crontab [option]
option:
-e: 编辑定时任务
-l :查询定时任务
-r:删除定时任务
*/1 * * * * 命令/或shell脚本
* 分别表示的是 分 小时 天 月 星期几
*/n 表示每隔n段时间执行一次
多个时间点用逗号连接,连续时间范围用-
*/1 1,5 * * *
*/1 * 5-6 * *
Shell 脚本
shell脚本的基本概念是一个命令列表中列出顺序执行。
刚才写的test.sh在其中添加两个命令
#!/bin/bash
echo "Hello World !"
pwd
ls
在输出Hello World ! 后,还会执行后面这两个命令。显示当前路径和列出文件
变量
一般变量大写,可以包含字母,数字,下划线
VAR_1="test1"
VAR_@="test2"
readonly VAR_1 #变量VAR_1不能被修改
echo $VAR_1 #会报错
unset VAR_2 #变量VAR_2设置的变量值会被取消
echo $VAR_2 #不会被输出
使用 $ 使用变量
单引号包含变量值的时候,内容不会被解析。原样输出
双引号包含变量值的时候,内容会被解析
当一个shell运行,存在主要三种类型的变量
- 局部变量:只能在函数内部使用
- 环境变量:可以在任何shell中使用
- 全局变量:在点钱shell中任何地方使用
特殊变量
| 变量 | 描述 |
|---|---|
| $0 | 获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径 |
| $n | 获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔 |
| $# | 获取当前执行的Shell脚本传入参数的总个数 |
| $* | 获取当前执行的Shell所有传入参数,将这些参数视为一个整体,而不是多个个体 |
| $@ | 获取当前执行的Shell所有传入参数,将所有参数当作同一字符串中的多个独立的单词 |
| $$ | 获得当前shell的进程ID(PID) |
| $? | 最近一个命令的退出状态码,通过对256取模得到的余数作为状态码 |
| $! | 最近一个后台命令的PID |
| $- | 显示Shell使用的当前选项,与set命令功能相同 |
关于$?得到的状态码,如果使用return,则返回return的结果,如果没有使用,将以最后一条命令运行结果,作为返回值,有以下几种
| 状态码 | 描述 |
|---|---|
| 0 | 命令成功结束 |
| 1 | 通用未知错误 |
| 2 | 误用Shell命令 |
| 126 | 命令不可执行 |
| 127 | 没找到命令 |
| 128 | 无效退出参数 |
| 128+x | Linux信号x的严重错误 |
| 130 | 命令通过Ctrl+C控制码越界 |
| 255 | 退出码越界 |
数组/Arrays
使用的是ksh shell在这里初始化数组的语法:
set -A array_name value1 value2 … valuen
使用的是bash shell中,这里是初始化数组的语法:
array_name=(value1 … valuen)
运算符
-
使用 expr方式,运算符之前要有空格
RESULT=`expr 2 + 3 `
-
使用[]方式
RESULT=$[(2+3)*4]
-
使用$()方式
RESULT=$(((2+3)*4))
-
条件判断[]
[ 条件 ] 中括号包围判断条件,且和条件中间有空格
算术运算符
假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | `expr $a + $b` 结果为 30。 |
| - | 减法 | `expr $a - $b` 结果为 -10。 |
| * | 乘法 | `expr $a * $b` 结果为 200。 |
| / | 除法 | `expr $b / $a` 结果为 2。 |
| % | 取余 | `expr $b % $a` 结果为 0。 |
| = | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
| == | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
| != | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
关系运算符
假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| -eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
| -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
| -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
| -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
布尔运算符
假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| ! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
| -o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
| -a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
逻辑运算符
假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
| || | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算符
变量 a 为 “abc”,变量 b 为 “efg”:
| 运算符 | 说明 | 举例 |
|---|---|---|
| = | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
| != | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
| -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
| -n | 检测字符串长度是否为0,不为0返回 true。 | [ -n “$a” ] 返回 true。 |
| $ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符
| 操作符 | 说明 | 举例 |
|---|---|---|
| -b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
| -c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
| -d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
| -f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
| -g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
| -k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
| -p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
| -u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
| -r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
| -w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
| -x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
| -s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
| -e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
条件语句
if 语句语法格式:
if condition
then
command1
command2
...
commandN
fi
if else 语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环一般格式为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
写成一行
for var in item1 item2 ... itemN; do command1; command2… done;
while循环
while condition
do
command
done
until 循环
和while循环相反,condition为false的时候,继续执行
case语句格式
case 条件 in
条件1)
command1
command2
...
commandN
;;
条件2)
command1
command2
...
commandN
;;
esac
shell 函数
格式,[]中的内容可以不写
[ function ] funname [()]
{
action;
[return int;]
}
如果参数返回不使用return,将以最后一条命令运行结果作为返回值
读取控制台输入内容
read [option] [variable]
option:
-p:读取控制台值时提示符
-t:等待时间
十秒内容输入内容,并使用NUM变量接收
read -t 10 -p "请输入内容" NUM
调用函数,不使用参数
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
调用函数,使用参数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
使用$n来获取调用函数时传的第n个参数
Shell 输入/输出重定向
重定向命令列表
| 命令 | 说明 |
|---|---|
| command > file | 将输出重定向到 file。 |
| command < file | 将输入重定向到 file。 |
| command >> file | 将输出以追加的方式重定向到 file。 |
| n > file | 将文件描述符为 n 的文件重定向到 file。 |
| n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
| n >& m | 将输出文件 m 和 n 合并。 |
| n <& m | 将输入文件 m 和 n 合并。 |
| << tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
本文详细介绍了Shell编程的基础知识,包括Shell脚本的概念、常见Shell环境、脚本解释器、变量使用、条件判断、循环控制、函数定义及输入输出重定向等核心内容。

被折叠的 条评论
为什么被折叠?



