Shell编程入门
程序员文章站
2022-07-12 12:30:52
...
1 认识Shell
Shell,Kernal和Hardware三者的关系如图1所示。在Linux OS中,默认Shell是Bash。通过命令行#echo $SHELL可以查看当前的Shell类型,# vim /etc/shells 可以查看OS支持的Shell类型。
2 创建第1个Shell脚本
2.1创建脚本
aaa@qq.com:~# vim hellowrold.sh
2.2编辑内容,保存即可
#!/bin/bash
echo "Hello World !" #输出Hello World !
2.3脚本执行方式
#方法1:赋予执行权限,直接运行
aaa@qq.com:~# .chmod 755 hello.sh
aaa@qq.com:~# ./helloworld.sh
#方法2:通过Bash调用执行脚本
aaa@qq.com:~#bash hello.sh
3 变量
3.1 命名
变量名=变量,如
name=dudu
注意:中间不要有空格
3.2 变量的使用
echo ${name}
echo $name
注意:加{}只是为了识别变量名的边界
3.3 三种易混淆引号(单引号,双引号和反引号)的区别
var1=haha
#输出变量值
echo "$var1"
#字符原样输出,单引号中的变量是无效的
echo '$var1'
#用于执行shell命令
echo `date`
4 字符串和数组
4.1字符串常用方法
s1="helloworld"
s2="hellobaby"
#判断字符是否相等
if [ $s1 = $s2 ]
then
echo "字符串$s1与字符串$s2相等"
fi
#判断字符是否不相等
if [ $s1 != $s2 ]
then
echo "字符串$s1与字符串$s2不相等"
fi
#查看字符串长度
expr length "$s1"
#截取
expr substr "$s1" 1 5
#查找首个匹配的字符串的位置
expr index "$s1" h
#查找首个匹配的字符串的位置注意:expr命令第一个字符的索引值为 1
4.2 数组的操作
my_array=("dudu" "dudumama")
#获取第n个元素
echo ${my_array[0]}
#获取所有元素
echo ${my_array[@]}
#获取数组长度
echo ${#my_array[@]}
5 运算符
5.1 算数运算符
n1=11
n2=2
#加法
echo "$n1 + $n2 =" `expr $n1 + $n2`
#减法
echo "$n1 - $n2 =" `expr $n1 - $n2`
#乘法
echo "$n1 x $n2 =" `expr $n1 \* $n2`
#除法
echo "$n1 / $n2 =" `expr $n1 / $n2`
#取余
echo "$n1 % $n2 =" `expr $n1 % $n2`
#判断两个数是否相等
if [ $n1 == $n2 ]
then
echo "n1 等于 n2"
fi
#判断两个数是否不相等
if [ $n1 != $n2 ]
then
echo "n1 等于 n2"
fi
5.2 关系运算符
#判断两个数是否相等
if [ $n1 == $n2 ]
then
echo "n1 等于 n2"
fi
#判断两个数是否不相等
if [ $n1 != $n2 ]
then
echo "n1 等于 n2"
fi
#判断大小
if [ $n1 -gt $n2 ]
then
echo "$n1 大于 $n2"
fi
if [ $n1 -lt $n2 ]
then
echo "$n1 小于 $n2"
fi
5.3 逻辑运算符
#或
if [[ $n1 -gt $n2 || $n1 == $n2 ]]
then
echo "(($n1 > $n2) || ($n1 == $n2)) = true"
fi
#非
if [[ $n1 -gt $n2 && $n1 == $n2 ]]
then
echo "(($n1 > $n2) && ($n1 == $n2)) = true"
fi
6 流程控制
6.1 for循环
for((i=1;1<=10;i++));
do
echo $i;
done
6.2 while循环
i=1
while(($i<=10))
do
echo $i
i= `expr $i + 1`
done
6.3 if语句
n1=3
n2=6
if [ $n1 -gt $n2 ]
then
echo "$n1大于$n2"
else
echo "$n1小于$n2"
fi
7 函数
7.1 没返回值
add(){
echo `expr 1 + 1 `
}
add
7.2 有返回值
add2(){
echo "请输入第一个数字:"
read n1
echo "请输入第二个数字:"
read n2
return `expr $n1 + $n2`
}
add2
echo "函数add2的返回值是$?"
8 输入/输出重定向
8.1命令 > 文件
将命令结果覆盖原文件内容
aaa@qq.com:~/shell_workspace# echo hello > file
aaa@qq.com:~/shell_workspace# cat file
hello
aaa@qq.com:~/shell_workspace# echo hello > file
aaa@qq.com:~/shell_workspace# cat file
hello
8.2 命令 >> 文件
将命令结果追加原文件内容后面
aaa@qq.com:~/shell_workspace# cat file
hello
aaa@qq.com:~/shell_workspace# echo hello >> file
aaa@qq.com:~/shell_workspace# cat file
hello
hello
8.3 命令 > /dev/null 2>&1
/dev/null是linux上一个特殊文件,可以看成一个黑洞,写入的数据就被丢掉,也无法从中读取数据。2>&1是指标准输出(stdout)和标准错误输出(sterr)
简而言之就是不输出任何结果信息。在实际应用中,比如某个进程的日志是没用的,我们就可以使用此法,将该进程的日志丢弃。
aaa@qq.com:~/shell_workspace# cat file > /dev/null 2>&1
aaa@qq.com:~/shell_workspace#
9 参考文献
[1] linux从入门到精通 第2版. 2014, 清华大学出版社.
[2] 菜鸟教程 https://www.runoob.com/linux/linux-shell.html.
上一篇: Shell脚本编程入门
下一篇: Shell 脚本编程入门(二)