Linux - Shell 编程入门
Linux - Shell 编程入门
目录
1 Shell 基本概念
Linux中的shell脚本是一个特殊的应用程序,它介于操作系统和系统内核之间,充当一个命令解释器 的角色。负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结 果。 同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在 高级语言中才具有的控制结构,包括循环和分支。 Linux 的 Shell 解释器 种类众多,一个系统可以存在多个 shell,可以通过 cat /etc/shells 命令查看系统 中安装的 shell解释器。 Bash 由于易用和免费,在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
1.1 解释器
// 查看 解释器
cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
1.2 编写脚本
// 创建 vim /usr/shell/hello.sh
//格式
#!/bin/bash
echo 'hello world'
1.3 执行shell 脚本
// 文件更改权限 执行权
chmod +x hello.sh
// 查看环境变量是否配置
echo $PATH
// 1
/bin/sh hello.sh
// 2
/bin/bash hello.sh
// bash 和 sh的关系
sh 是 bash 的快捷方式
// 3
sh hello.sh
bash hello.sh
2 Shell 编程基础
2.1 变量
// 变量名和等号之间不能有空格
// 命名规则
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
//示例
username='tom'
// 1 使用变量
uername='tomc'
echo $username
echo ${ausername}
// 大括号可用来帮助解释器识别变量边界
habby="i like ${course}script" //当连续字符串需用到之前定义变量时(course)
habby="i like $coursescript"
habby="i like $course script" //区别是不再连续
// 2 只读变量 值不可修改
username=tom
readonly username
username=jack 报错 /bin/sh: NAME: This variable is read only.
// 3 删除变量 无法删除只读变量
unset variable_name
2.2 字符串
// 可用单引号,双引号,不用引号
// 1 单引号 限制
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行)
skill='java'
str='I am goot at $skill'
echo $str
//结果:
I am goot at $skill
// 2 双引号
双引号里可以有变量
双引号里可以出现转义字符
skill='java'
str="I am goot at $skill"
echo $str
//结果
I am goot at java
// 3 获取字符串长度
skill='java'
echo ${skill} # 输出结果: java
echo ${#skill} # 输出结果: 4
// 4 提取子字符串
str="i like hadoop"
echo ${str:2} #substring(2)
echo ${str:2:2} #substring(2,2)
// 5 查找子字符串
查找字符o在那个位置(最先出现的字符)
str="hadoop is so easy"
echo `expr index "$str" o`
2.3 运算符
2.3.1 算术运算符
// 原始bash不支持简单数学运算,可使用expr
//示例
val=`expr 1 + 2`
echo $val
*表达式和运算符之间要有空格,例如 1+2 是不对的,必须写成 1 + 2。
完整的表达式要被 ` 包含,注意不是单引号,在 Esc 键下边。
// 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20
+ - * / %
= //赋值 a=$b
== //相等返回true
!= //不等返回true
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,
必须写成 [ $a == $b ]
// 编写sh脚本
#乘法运算,注意*号前面需要反斜杠
echo expr $a \* $b
可以通过(())、$(())、$[]进行算术运算。
((a++))
echo "a = $a"
c=$((a + b))
d=$[a + b]
echo "c = $c"
echo "d = $d"
2.3.2 关系运算符
// 只支持数字,不支持字符串,除非字符串的值是数字
-eq:检测两个数是否相等,相等返回 true。
-ne:检测两个数是否不相等,相等返回 true。
-gt:检测左边的数是否大于右边的,如果是返回 true。
-lt:检测左边的数是否小于右边的,如果是返回 true。
-ge:检测左边的数是否大于等于右边的,如果是返回 true。
-le:检测左边的数是否小于等于右边的,如果是返回 true
2.3.3 流程控制 if
// if
if condition
then
command1
command2
...
commandN
fi
// if else
if condition
then
command1
command2
...
commandN
else
command
fi
// if elif else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
//
if [condition] ; then
echo 'xxx'
else
echo 'xx'
fi
2.3.4 for 循环
for variable in (list); do // variable 为变量名 list 有多种表达形式
command
command
...
done
//list
1 2 3 4 5 // 1~5
{1..100} // 1~100
{1..100..2} // 1~00奇数 +2
`ls /` //根目录下的内容
2.3.5 while 语句
// while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件
while condition; do
command
done
// 计算1~100 和
sum=0
i=1
while [ $i -le 100 ]; do
sum=$[ sum + i ]
i=$[ i + 1 ]
done
echo $sum
2.3.6 无线循环
// 1
for ((;;))
do
command
done
// 2
while true
do
command
done
2.3.7 case
// Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
// 示例
echo '输入 1 到 4 之间的数字:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
2.3.8 跳出循环 break
// break命令允许跳出所有循环(终止执行后面的所有循环)
# 需求: 执行死循环 每隔1秒打印当前时间, 执行10次停止
i=0;
while true; do
sleep 1
echo $i `date +"%Y-%m-%d %H:%M:%S"`
i=$[ i + 1]
if [ $i -eq 10 ]; then
break
fi
done
2.3.9 continue
// 跳过本次循环
# 需求: 打印 1~30, 注意 跳过3的倍数
for i in {1..30}; do
result=$[ i % 3 ]
if [ $result -eq 0 ]; then
continue
fi
echo $i
done
2.3.10 函数使用
// 格式
[ function ] funname()
{
action;
[return int;]
}
// 可以带[ function ] fun() 定义,也可以直接fun() 定义,不带任何参数
// 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后 0-255
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
2.3.11 传参数给函数
// 在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !" //也可以用 $@
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
// 结果
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

浙公网安备 33010602011771号