1.shell简介
1.1 shell
Shell 是1个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是1种命令语言,又是1种程序设计语言。
Shell 是指1种利用程序,这个利用程序提供了1个界面,用户通过这个界面访问操作系统内核的服务。
1.2 shell脚本
Shell 脚本(shell script),是1种为shell编写的脚本程序。
1.3shell类型
bash
csh
dash
ksh
....
2.shell入门
2.1编写第1个shell脚本
test.sh:
#!/bin/bash
echo "Hello World !"
注:
2.2履行脚本
1.
#chmod +x test.sh
#./test.sh
2.
/bin/bash test.sh
3.shell 变量
3.1变量定义
var=val
var="val"
var='val'
循环赋值:
for file in 'ls /etc'
规则:
1.变量定义时,不使用$符号;
2.变量名与等号之间不能有空格;
3.首个字符必须为字母(a-z,A-Z);
4.中间不能有空格,可使用下划线(_);
5.不能使用标点符号;
6.不能使用bash里的关键字(可用help命令查看保存关键字)。
3.2使用变量
var=val
echo $var
echo $(var)
3.3只读变量
通过readonly关键字声明:
var=val
readonly var
3.4删除变量
通过unset关键字声明:
var=val
unset var
3.5变量类型
环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也能够定义环境变量。
局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有1部份是环境变量,有1部份是局部变量,这些变量保证了shell的正常运行
3.6shell字符串
1.字符串声明:
单引号:
str='string'
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号:
str="string"
双引号里可以有变量;
双引号里可以出现转义字符
无引:
str=string
2.拼接字符串:
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
3.获得字符串长度:
string="abcd"
echo ${#string}
4.提取子字符串:
string="runoob is a great site"
echo ${string:1:4}
5.查找子字符串:
string="runoob is a great company"
echo `expr index "$string" is`
注意: 以上脚本中 "`" 是反引号,而不是单引号 "'"。
3.7shell数组
bash支持1维数组(不支持多维数组),并且没有限定数组的大小。
1.定义数组
array=(val0 val1 val2 ...)
array_name=(
value0
value1
value2
value3
)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
2.读取数组
${array[index]}
通过"@"取得数组中的所有元素:
echo ${array[@]}
3.获得数组长度
获得数组元素个数:
length=${
length=${
取得单个数组元素的长度:
length=${
3.8shell注释
1.以"#"开头行表示shell注释行
2.shell无多行注释操作,只能每行行头添加"#"
4.Shell 传递参数
4.1传递参数使用
我们可以在履行 Shell 脚本时,向脚本传递参数,脚本内获得参数的格式为:$n。n 代表1个数字,1 为履行脚本的第1个参数,2 为履行脚本的第2个参数,以此类推……
例:
test.sh:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "履行的文件名:$0";
echo "第1个参数为:$1";
echo "第2个参数为:$2";
echo "第3个参数为:$3";
效果:
$ ./test.sh 1 2 3
Shell 传递参数实例!
履行的文件名:test.sh
第1个参数为:1
第2个参数为:2
第3个参数为:3
4.2特殊参数
$# 传递到脚本的参数个数
$* 以1个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的情势输出所有参数。
$$ 脚本运行确当前进程ID号
$! 后台运行的最后1个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每一个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的情势输出所有参数。
$- 显示Shell使用确当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有毛病,其他任何值表明有毛病。
注:
$* 与 $@ 区分:
相同点:都是援用所有参数。
不同点:只有在双引号中体现出来。假定在脚本运行时写了3个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了1个参数),而 "@" 等价于 "1" "2" "3"(传递了3个参数)。
例:
test.sh:
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
效果:
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
5.shell基本运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最经常使用。
expr 是1款表达式计算工具,使用它能完成表达式的求值操作。
注意
1.使用的是反引号 ` 而不是单引号 ';
2.表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟习的大多数编程语言不1样。
例:
test.sh:
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
5.1 算数运算符
运算符 |
说明 |
举例 |
+ |
加法 |
`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。 |
5.2 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
运算符 |
说明 |
返回值 |
-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。 |
5.3 布尔运算符
运算符 |
说明 |
举例 |
! |
非运算,表达式为 true 则返回 false,否则返回 true。 |
[ ! false ] 返回 true。 |
-o |
或运算,有1个表达式为 true 则返回 true。 |
[ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a |
与运算,两个表达式都为 true 才返回 true。 |
[ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
5.4 逻辑运算符
运算符 |
说明 |
举例 |
&& |
逻辑的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| |
逻辑的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
5.5 字符串运算符
运算符 |
说明 |
举例 |
= |
检测两个字符串是不是相等,相等返回 true。 |
[ $a = $b ] 返回 false。 |
!= |
检测两个字符串是不是相等,不相等返回 true。 |
[ $a != $b ] 返回 true。 |
-z |
检测字符串长度是不是为0,为0返回 true。 |
[ -z $a ] 返回 false。 |
-n |
检测字符串长度是不是为0,不为0返回 true。 |
[ -n $a ] 返回 true。 |
str |
检测字符串是不是为空,不为空返回 true。 |
[ $a ] 返回 true。 |
5.6 文件测试运算符
运算符 |
说明 |
举例 |
-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。 |
6.shell echo命令
6.1 显示普通字符串
echo "It is a test"
echo It is a test
6.2 显示转义字符
echo "\"It is a test\""
6.3 显示变量
#!/bin/sh
read name
echo "$name It is a test"
6.4 显示换行
echo -e "OK! \n"
echo "It it a test"
6.5 显示不换行
#!/bin/sh
echo -e "OK! \c"
echo "It is a test"
6.6 显示结果定向至文件
echo "It is a test" > myfile
6.7 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
6.8 显示命令履行结果
echo `date`
注意是反引号,适用于履行相干命令。
7. shell printf命令
1.printf语法
printf format-string [arguments ...]
例:
test.sh:
#!/bin/bash
printf "%⑴0s %⑻s %⑷s\n" 姓名 性别 体重kg
printf "%⑴0s %⑻s %⑷.2f\n" 郭靖 男 66.1234
printf "%⑴0s %⑻s %⑷.2f\n" 杨过 男 48.6543
printf "%⑴0s %⑻s %⑷.2f\n" 郭芙 女 47.9876
格式符使用同C语言的printf函数。
7. shell test命令
Shell中的 test 命令用于检查某个条件是不是成立,它可以进行数值、字符和文件3个方面的测试。
7.1 数值测试
参数 |
说明 |
-eq |
等于则为真 |
-ne |
不等于则为真 |
-gt |
大于则为真 |
-ge |
大于等于则为真 |
-lt |
小于则为真 |
-le |
小于等于则为真 |
7.2 字符串测试
参数 |
说明 |
= |
等于则为真 |
!= |
不相等则为真 |
-z 字符串 |
字符串的长度为零则为真 |
-n 字符串 |
字符串的长度不为零则为真 |
7.3 文件测试
参数 |
说明 |
-e 文件名 |
如果文件存在则为真 |
-r 文件名 |
如果文件存在且可读则为真 |
-w 文件名 |
如果文件存在且可写则为真 |
-x 文件名 |
如果文件存在且可履行则为真 |
-s 文件名 |
如果文件存在且最少有1个字符则为真 |
-d 文件名 |
如果文件存在且为目录则为真 |
-f 文件名 |
如果文件存在且为普通文件则为真 |
-c 文件名 |
如果文件存在且为字符型特殊文件则为真 |
-b 文件名 |
如果文件存在且为块特殊文件则为真 |
另外,Shell还提供了与( -a )、或( -o )、非( ! )3个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
#!/bin/bash
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '有1个文件存在!'
else
echo '两个文件都不存在'
fi
8.流程控制
8.1if else
1.
if condition
then
command1
command2
...
commandN
fi
2.
if condition
then
command1
command2
...
commandN
else
command
fi
3.
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
8.2for
1.
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
无穷循环:
for (( ; ; ))
do
commands
done
8.3while
1.
while condition
do
command
done
无穷循环:
1.
while :
do
command
done
2.
while true
do
command
done
8.4case
1.
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
8.5until
1.
until condition
do
command
done
8.6 跳出循环
1.break:适用于所有循环,并且跳出所有循环
2.continue:适用于所有循环,跳出当前循环
3.esca:仅用于case循环中
9.shell函数
9.1 shell函数定义
[ function ] funname [()]
{
action;
[return int;]
}
说明:
1、可以带function fun() 定义,也能够直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后1条命令运行结果,作为返回值。 return后跟数值n(0-255)
9.2 shell 函数参数
1.
在shell函数体内部,通过 $n 的情势来获得参数的值,例如,$1表示第1个参数,$2表示第2个参数...
例:
test.sh:
#!/bin/bash
funWithParam(){
echo "第1个参数为 $1 !"
echo "第2个参数为 $2 !"
echo "第10个参数为 $10 !"
echo "第10个参数为 ${10} !"
echo "第101个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为1个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
效果:
第1个参数为 1 !
第2个参数为 2 !
第10个参数为 10 !
第10个参数为 34 !
第101个参数为 73 !
参数总数有 11 个!
作为1个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
注意:
$10 不能获得第10个参数,获得第10个参数需要${10}。当n>=10时,需要使用${n}来获得参数。
2.特殊参数
同shell脚本传参相同,请回顾该小节。
10.Shell 输入/输出重定向
10.1重定向命令表
命令 |
说明 |
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 之间的内容作为输入。 |
10.2 Here Document
Here Document 是 Shell 中的1种特殊的重定向方式,用来将输入重定向到1个交互式 Shell 脚本或程序。它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
它的基本的情势以下:
command << delimiter
document
delimiter
注意:
1.结尾的delimiter 1定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
2.开始的delimiter前后的空格会被疏忽掉。
例:
test.sh:
#!/bin/bash
cat << EOF
welcome
feison`s blog!
EOF
效果:
welcome
feison`s blog!
11.shell文件包括
1.Shell 也能够包括外部脚本。这样可以很方便的封装1些公用的代码作为1个独立的文件。
2.文件包括语法格式:
. filename
或
source filename
注意:
被包括的文件 test1.sh 不需要可履行权限。
12.写在后面
本文是学习[菜鸟教程shell](http://www.runoob.com/linux/linux-shell.html)的笔记,记录的是本人在shell方面的薄弱点,主要是打基础,方便以后回顾,编写的不够深入和全面,大家如有不同看法可以留言评论,相互交换学习。