shell编程
1.简介
1.1什么是shell
把在终端运行的命令保存到文件中,这个文件就是shell程序
简单的说,shell编程就是第Linux命令的逻辑化处理
1.2shell解析器的类型
bash,ash,ksh等,默认使用bash
演示命令: echo $SHELL/$0 /bin/bash
1.3shell的作用
如果需要反复执行某些Linux命令,则可以将这些命令写到一个shell脚本中,然后每次只需要运行一下这个脚本即可
2.第一个shell程序
2.1实现
打开文本编辑器(可以使用 touch命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好
代码演示:
#!/bin/bash #打印hello world echo "Hello World !"
2.2运行
方式一:作为可执行程序
touch test.sh vim test.sh chmod +x ./test.sh ./test.sh
方式二:作为解释器参数
bin/bash test.sh
3.shell中的变量
3.1变量的定义
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)
定义:变量名=值
演示命令: name="zhangsan" echo $name num=10 echo ${num} # 注意:变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 echo "his name is ${name}"
3.2只读变量
readonly:只读,将变量声明为readonly,只读变量的值不能发生改变
myUrl="http://www.baidu.com" readonly myUrl myUrl="http://www.1000phone.com" #运行脚本,报错:/bin/sh: NAME: This variable is read only
3.3删除变量
unset:删除变量
代码演示: myUrl="http://www.baidu.com" unset myUrl echo $myUrl #变量被删除后不能再次使用。unset 命令不能删除只读变量。 #以上实例执行将没有任何输出
4.字符串和数组
4.1字符串
双引号或者单引号
单引号的限制:
a.单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的
b.单引号字符串中不能再出现单引号【对单引号进行转义后去不起作用】
总结:
双引号:可以包含除了$、`、\、‘‘之外的任意字符
单引号:其中的任意字符都不会被解析,都会原样输出
反引号:会将其中的内容作为命令执行
反斜线:转义特定的字符,如:&、*、^、等
代码演示:
代码演示:
#!/bin/bash
#定义字符串
your_name='qinjx'
str="Hello, I know you are \"$your_name\"! \n"
#拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
#获取字符串长度
string="abcd"
echo ${#string} #输出 4
#提取子字符串
string="1000phone is a great site"
echo ${string:1:4} #从下标1开始,长度为4
#查找子字符串
string="1000phone is a great company"
echo `expr index "$string" is`
# 查找字符i或s的位置
#注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦
4.2数组
bash只支持一维数组,不支持多维数组
并没有限制数组的大小
数组元素的下标也是从0开始的,获取数组中的元素使用下标
定义数组:数组名=(值1 值2 值3…)
注意:shell中的数组元素之间使用空格分隔
代码演示
#数组的定义
arr1=(10 20 30 40)
echo $arr1
arr2=(10 20 30 40)
echo $arr2
#数组的使用
#读取数组中的元素
echo ${arr1[2]}
#如果要读取数组中的全部元素
echo ${arr2[@]}
# 取得数组元素的个数
length=${#arr1[@]}
echo $length
# 或者
length=${#arr1[*]}
echo $length
# 取得数组单个元素的长度
lengthn=${#arr1[3]}
echo $lengthn
5.shell中的运算符
expr:是一款表达式计算工具,使用它能够完成表达式的求值操作
代码演示:
val=`expr 1 + 2`
echo "两数之和为 : $val"
#1.算术运算符
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
#2.关系运算符
## []中,前后都需要空格
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
#3.逻辑运算符
if [ 1 -lt 3 ] && [ 2 -lt 3 ];
then
echo "ok"
fi
6.echo、printf、test命令
1>echo
字符串的输出
echo -e "OK! \n" # -e 开启转义,\n 显示换行 echo -e "OK! \c" # -e 开启转义 \c 不换行 echo `date` #显示命令执行结果 #注意: 这里使用的是反引号 `, 而不是单引号 '。 #结果为:Thu Jul 24 10:08:46 CST 2014
2> printf
printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234 printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543
注意:
%s %d %f都是格式替换符
-10s:指的是一个宽度为10的字符(-表示左对齐,没有则表示右对齐),任何字符都会填充在这10个字符内,如果不足则使用空格自动填充
-4.2f:指的是格式化为小数,其中.2表示保留小数点后两位
3> test
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
#1.数值测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
#2.字符串测试
num1="hello"
num2="hello11"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
#3.文件测试
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
test命令用来监测某个条件是否成立,他可以进行数值,字符和文件的监测
7.shell中的流程控制语句
7.1分支语句
if
代码演示:
#if语句
#单分支
if [ 1 -lt 3 ] && [ 2 -lt 3 ];
then
echo "ok"
fi
#双分支
num1=$[2*3]
num2=$[1+5]
#if else语句经常与test命令结合使用
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
#多分支
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
#case语句
echo '输入 1 到 4 之间的数字:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
7.2循环语句
for
代码演示:
#for语句
#需求:顺序输出当前列表中的数字
for num in 1 2 3 4 5
do
echo "The value is: $num"
done
#需求:顺序输出字符串中的字符
for str in 'This is a string'
do
echo $str
done
#需求:遍历数组中的所有元素
a=(1 2 3)
for x in ${a[*]}
do
echo $x
done
8.函数
代码演示:
#无参无返回值
#定义函数
demo()
{
echo 'hello world'
}
#调用函数
demo
#有返回值
funWithReturn(){
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
return $(($aNum+$anotherNum))
}
funWithReturn
echo $?
#有参有返回值
arg()
{
echo $1
echo $2
echo $#
echo $*
return 123
}
arg 1 2
# $? 表示函数的返回值
echo $?
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |