欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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类型。

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.

相关标签: Linux