Shell 命令介绍
Linux 上常见的几种 Shell 脚本解释器有 bash、sh、ash、csh、ksh,我们常说的多种 Shell,其实说的是 Shell 脚本解释器。
- bash: bash 是 Linux 系统默认使用的 shell。bash 由 Brian Fox 和 Chet Ramey 共同完成,是 BourneAgain Shell 的缩写,内部命令一共有 40 个。
- sh:sh 由 Steve Bourne 开发,是Bourne Shell的缩写,各种UNIX系统都配有sh。
- ash:ash shell 是由 Kenneth Almquist 编写的,Linux 中占用系统资源最少的一个小 shell,它只包含 24 个内部命令,因而使用起来很不方便。
- csh:csh 是 Linux 比较大的内核,它由以 William Joy 为代表的共计 47 位作者编成,共有 52 个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。
- ksh:ksh 是 Korn shell 的缩写,由 Eric Gisin 编写,共有 42 条内部命令。该shell最大的优点是几乎和商业发行版的 ksh 完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
重定向符
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据 |
重定向输出 | > | 将标准输出结果 保存 到指定的文件,并且覆盖原有内容 |
>> | 将标准输出结果 追加 到指定的文件的尾部,不覆盖原有内容 | |
标准错误输出 | 2> | 将错误信息 保存 到指定的文件,并且覆盖原有内容 |
2>> | 将错误信息 追加 到指定的文件的尾部,不覆盖原有内容 | |
混合输出 | &> | 将标准输出、标准错误保存到同一文件中【&表示等同于的意思】 |
2>&1 | 将标准错误输出重定向到标准输出 | |
1>&2 | 把标准输出重定向到标准错误 |
Shell 内嵌命令
- echo:显示变量内容。
- env:显示目前系统中主要的预设变量内容。
- set:显示目前系统中全部的变量内容。
- 语法:set [-options] [var1 var2 …]
-a:标示已修改的变量,以供输出至环境变量 -b:使被中止的后台程序立刻回报执行状态 -d:Shell 预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用 -d 参数可取消 -e:若指令传回值不等于 0,则立即退出 shell -f:取消使用通配符 -h:自动记录函数的所在位置 -k:指令所给的参数都会被视为此指令的环境变量 -l:记录 for 循环的变量名称 -m:使用监视模式 -n:测试模式,只读取指令,而不实际执行 -p:启动优先顺序模式 -P:启动 -P 参数后,执行指令时,会以实际的文件或目录来取代符号连接 -t:执行完随后的指令,即退出 shell -u:当执行时使用到未定义过的变量,则显示错误信息 -v:显示 shell 所读取的输入值 -H shell:可利用"!"加<指令编号>的方式来执行 history 中记录的指令 -x:执行指令后,会先显示该指令及所下的参数 +<参数>:取消某个 set 曾启动的参数。与-<参数>相反 -o option:特殊属性还有很多,大部分与上面的可选参数功能相同 ```
- read:从键盘读入变量内容。
示例:-a:把读取的数据赋值给数组 array,从下标 0 开始 -d:用字符串 delimiter 指定读取结束的位置 -e:在获取用户输入的时候,对功能键进行编码转换 -p:显示提示信息,提示内容为 prompt -r: 原样读取(Raw mode),不把反斜杠字符解释为转义字符 -n:读取 num 个字符,而不是整行字符 -s:静默模式(Slient mode),不会在屏幕上显示输入的字符,输入密码或其它确认信息时常用 -t:设置超时时间 -u:使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向
#!/bin/bash read -t 10 -sp "请输入密码(10s内):" pwd1 echo # 这是换行(使用了-s静默模式才需要这个换行符) read -t 10 -sp "请再次输入密码(10s内):" pwd2 printf "\n" # 校验密码两次是否一致 if [ $pwd1 == $pwd2 ] # 这里变量名前后一定都要有空格 then echo "两次密码一致,认证通过~" else echo "密码不一致,验证失败!" fi
- declare:声明变量内容。
+/-:-用来指定变量有该属性,+是取消该属性; -a:定义为数组 array,格式为 数组名=(值1 值 2 ...) 或 数组名=([0]=值1 [1]=值2 ...) -A:Array,设置为 key-value 关联数组(索引是字符串),格式 数组名=([字符串key1]=值 1 [字符串key2]=值2 ...) -f:定义为函数 function -i:定义为整数 integer -r:定义为“只读” -x:定义为透过环境输出变量
- exit:用于退出当前 shell 环境进程结束运行,并且可以返回一个状态码.一般使用 $? 可以获取状态码。
Shell 基本运算符
算术运算符
+:对两个变量做加法。
-:对两个变量做减法。
\*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取模运算,第一个变量除以第二个变量求余数。
+=:加等于,在自身基础上加第二个变量。
-=:减等于,在第一个变量的基础上减去第二个变量。
*=:乘等于,在第一个变量的基础上乘以第二个变量。
/=:除等于,在第一个变量的基础上除以第二个变量。
%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。
在使用这些运算符时需要注意运算顺序的问题。
在 shell 中有三种方法可以更改运算顺序:
用 expr 改变运算顺序。可以用 echo `expr 1 + 2`来输出 1+2 的结果,用 expr 表示后面的表达式为一个数学运算。
用 let 指示数学运算。可以先将运算的结果赋值给变量 b,运算命令是 b=let1 + 2。然后用 echo $b 来输出 b 的值。如果没有 let,则会输出 1+2。
用 $[] 表示数学运算。将一个数学运算写到 $[] 符号的中括号中,中括号中的内容将先进行数学运算(中括号中可以包含空格)。例如命令 echo $[1+2],将输出结果 3。
关系运算符
-eq:数值相等。
-ne:数值不相等。
-ge:数 1 大于等于数 2。
-lt:数 1 小于数 2。
-gt:数 1 大于数 2。
-le:数 1 小于等于数 2。
条件语句
- if …fi
示例:#!/bin/bash declare -i a=10 declare -i b=20 if [ $a == $b ];then echo "a is equal to b" fi
- if…else…fi
示例:#!/bin/bash declare -i a echo "input 1 or 2" read a if [ $a -eq 1 ];then echo "1" else echo "2" fi
- if…elif…else…fi
示例:#!/bin/bash declare -i a=10 declare -i b=20 if [ $a == $b ];then echo "a is equal to b" elif [ $a -gt $b ];then echo "a is greater than b" else echo "a is less than b" fi
- case…esac
示例:#!/bin/bash echo "you like" echo "1 is apple" echo "2 is orange" echo "input your choice" read a case $a in 1) echo "you like apple" ;; 2) echo "you like orange" ;; *) echo "you like nothing" exit 1 esac
循环类型
-
for 循环
示例:#!/bin/bash declare -i s s=0 for (( i=1; i<=100; i++ )) do s=s+i done echo "the sum is $s"
-
while 循环
示例:#!/bin/bash declare -i a=0 while [ $a -lt 10 ] do echo $a a=a+1 done
-
until 循环
示例:#!/bin/bash declare -i a=0 until [ $a -gt 10 ] do echo $a a=a+1 done
-
select 循环
示例:#!/bin/bash echo "what is this?" select i in tea cofee water apple orange none do case $i in tea|cofee|water) echo "drink";; apple|orange) echo "fruit";; none) break;; *) echo "ERROR: Invalid selection";; esac done
Shell 数组
a=(123 456 789)
echo $a # 默认打印第一个元素
echo ${a[1]} # 打印第二个元素
echo ${a[@]} # 打印整个数组
示例:
#!/bin/bash
declare -a a=(1 2 3 4 5 )
for (( i=0; i<=4; i++ ))
do
echo ${a[i]}
函数
# 语法
function_name(){}
# 示例
#!/bin/bash
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello