shell 编程
1.shell变量
- 定义变量
定义变量时,变量名不需美元符号,变量名与等号之间不能有空格。
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,但是可以有下划线(_)
- 不能使用标点符号,
- 不能使用bash里的关键字。(可用help查看保留关键字)
除了显式地赋值,还可以用语句给变量赋值,
for file in `ls /etc`
或
for file in $(ls /etc)
- 使用变量
使用一个定义过的变量,只需在变量名前面加美元符即可:
string="abcd"
echo $string
- 只读变量
使用readonly命令,将变量定义为只读变量,只读变量不能被改变
readonly string
- 删除变量
使用unset命令,可以删除变量 - 变量类型
- 局部变量
- 环境变量
- shell变量
2.shell 字符串
字符串可以用单引号,双引号,也可以不用引号。
- 单引号
- 单引号的任何字符串都会原样输出,单引号字符串中的变量是无效的;
- 单引号字符串中,不能出现单独的一个单引号(转移符号+'也不行),但是可以成对出现,作为字符串的拼接使用。
- 双引号
your_name="abcd"
str1="hello,you are\"$your_name\"! \n"
echo -e $str1
双引号的优点:
- 双引号里可以有变量
- 双引号中可以有转义字符
- 拼接字符串
#双引号拼接
greeting="hello,"$your_name" !"
#单引号拼接
greeting="hello,'$your_name' !"
- 获取字符串的长度
echo ${#str1}
- 提取子字符串
string1="abdadsjfafa"
#提取字符串的第2个字符开始截取4个字符
echo ${string1:1:4}
- 查找子字符串
`
查找字符f或者a的位置
echo expr index "string1" fa
`
3.shell数组
- 定义数组
- 用括号表示数组,数组元素用“空格”符号分开。
array_1=(1 2 3 4)
- 还可以单独定义数组的各个分量
array_1[0]=1
array_1[1]=2
array_1[3]=3
- 读取数组
${数组名[下标]}
#使用@符号可以获取数组中的所有元素
echo ${array_1[@]}
- 获取数组长度
len1=${#array_1[@]}
#或者
len1=${#array_1[*]}
#取单个数组元素的长度
len2=${#array_1[n]}
4.shell传递参数
脚本内获取参数的格式为:$n。n=0为执行文件名(包含路径),n=1代表第一个参数,2为执行脚本的第二个参数,
另外还有几个特殊字符用来处理参数。
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个字符串显示所有参数 |
$@ | 与@"的形式,输出为"2"..."$n"所有参数 |
$$ | 脚本当前进程的ID号 |
$! | 后台运行的最后一个ID号 |
5. shell中的[](包括双 中括号)
[]中与中间的代码应该有空格隔开
shell中的中括号可用于一些条件的测试:
- 算术比较,比较一个变量是否为0,[ $var -eq 0 ]
- 文件属性测试,比如一个文件是否存在,[ -e var ]
- 字符串比较, [[ &var1 = $var2 ]]
6. shell基本运算符
- 算术运算符
运算符 | 说明 | 例子 |
---|---|---|
+ | 加法 | expr $a + $b |
- | 减法 | |
* | 乘法 | |
/ | 除法 | |
% | 取余 | |
= | 赋值 | |
== | 相等 | |
!= | 不相等 |
- 关系运算符
运算符 | 说明 | 例子 |
---|---|---|
-eq | 检测两个数是否相等,相等返回True | [ b ] 返回false |
-ne | 不相等返回True | |
-gt | > ,返回True | |
-lt | < ,返回True | |
-ge | >= | |
-le | <= |
- 布尔运算符
运算符 | 说明 | 例子 |
---|---|---|
! | 非运算 | [ ! True ] 返回false |
-o | 或运算 | |
-a | 与运算 |
- 字符串运算符
运算符 | 说明 | 例子 |
---|---|---|
= | 检测两个字符串是否相等,相等返回True | [ b ] 返回false |
!= | 不相等返回True | |
-z | 检测字符串长度是否为0 ,为0返回True | |
-n | 检测字符串长度是否不为0 ,不为0 返回True | |
$ | 检测字符串是否为空,不为空返回True |
- 文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件 | |
-c file | 检测文件是否是字符设备文件 | |
-d file | 检测文件是否是目录 | |
-f file | 检测文件是否是普通文件(既不是目录也不是块设备) | |
-x file | 检测文件是否可执行 | |
-r file | 检测文件是否可读 | |
-w file | 检测文件是否可写 | |
-s file | 检测文件是否为空(文件大小是否大于0) | |
-e file | 检测文件是否存在 |
7.shell echo命令
echo 命令用于字符串的输出。
`
echo "it is a test"
双引号也可以省略
echo it is a test
显示转义字符
echo "" it is a test ""
结果是
"it is a test"
`
8 shell test命令
test 命令用于检查某个条件是否成立,他可以进行数值、字符、和文件三个方面的测试。
举例
a=5
b=6
if test $[a] -eq $[b]
then
echo "两个数相等"
else
echo "两个数不相等"
#if 反过来写,代表判断结构体结束
fi
#[]中括号代表执行基本的算术运算。
result=$[a+b]
echo $result
9 shell 流程控制
- if else
- if
if condition
then
command1
command2
fi
- if else-if else
if conditon1
then
command1
elif condition2
command2
else
command3
fi
- for 循环
for 循环的一般格式
for var in item1 item2 ... itemn
do
command1
command2
...
done
- while 语句
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件,其格式为:
while condition
do
command
done
无限循环
while
do
command
done
#或者
while true
do
command
done
- until 循环
until循环执行一些列命令直至条件为true时停止。
until 循环和while循环在处理方式上刚好相反。
举例
a=0
until [ ! $a -lt 10 ]
do
echo $a
#let语句,用于执行一个或者多个表达式,变量中不需要加上$来表示变量,
let "a++"
done
- case
shell 的case语句为多选择语句,可以使用case语句匹配一个值与一个模式,如果匹配成功,执行相应命令。之后不再继续其他模式。如果无一匹配模式,使用*号捕获该值在执行后面的命令。
case 值 in
模式1)
command1
command2
...
;;
模式2)
command1
command2
...
;;
*)
command1
;;
esac
- 跳出循环
break命令
continue 命令
10 shell函数
- 用户自定义函数
[ function ] funname [()]
{
action;
[return int;]
}
- 1.可以带参数fun()定义,也可以不带任何参数
- 2.参数返回,可以显示加 :return返回,如果不加,则以最后一条命令的运行结果作为返回值。
- 函数参数
举例说明
funwithparam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "参数共有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funwithparam 1 2
11 shell 输入/输出重定向
重定向命令列表
命令 | 说明 |
---|---|
command > file | 将输出重定向到file |
command < file | 将输入重定向到file |
command >> file | 将输出以追加的方式重定向到file |
n > file | 将文件描述符为n的文件重定向到file |
n >& m | 将输出文件m和n合并 |
n <& m | 将输入文件m和n合并 |
<<tag | 将开始标记tag和结束标记tag之间的内容作为输入。 |
实例
who > users
#将who命令的完整输出重定向在用户文件中(users)。
#输出重定向会覆盖文件内容,
echo "abdansdf" > users
#此时users变为“abdansdf”,若果不希望内容被覆盖,可以使用>>将内容追加到文件末尾
- 输入重定向
和输出重定向一样,unix命令也可以从文件获取输入,语法为:
command1 < file1
实例
command1 < infile > outfile
#同时替换输入和输出,执行command1,从文件infile读取内容,然后 将输出写入到outfile中。
- 重定向 深入讲解
一般情况下,每个unix命令都会打开三个文件: - 标准输入文件(stdin):文件描述符为0
- 标准输出文件(stdout):文件描述符为1
- 标准错误文件(stderr):文件描述符为2
默认情况下,command > file 将stdout重定向到file,command < file 将stdin重定向到file
如果希望将stderr重定向到file,可以写成:
command 2 > file