文章目录
〇、准备工作
- Shell种类:
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
执行shell脚本的过程
- 创建一个脚本文件:
sh0.sh
#!/bin/bash
echo "Hello World !"
脚本的第一行约定了使用哪一种 Shell。
- 添加可执行权限:
chmod +x ./sh0.sh
- 执行脚本:
# 执行方式1
./sh0.sh
# 执行方式2
/bin/bash sh0.sh
Shell语法规则总结
可以看完这篇博客了再来看这些规则。
- 单引号中不能转义字符,也不能使用变量。
- 赋值的=两侧不能有空格。
- 使用表达式时,运算符号两侧要有一个空格。
一、变量
sh1-0.sh
#!/bin/bash
# 声明变量
my_name="tracy"
# 使用变量,建议使用{}把变量包裹起来,虽然不用也可以
echo ${my_name}
# 变量可重新赋值
my_name="tracy1"
echo ${my_name}
# 设置变量为只读
read_only_var="read only var"
readonly read_only_var
# 下面这一行会报错
# read_only_var="change var"
echo ${read_only_var}
# 删除变量
unset my_name
# 下面这一行不会打印任何内容,因为访问了一个不存在的变量
echo ${my_name}
- 命名规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(见本教程最后一章)。
1.字符串
sh1-1.sh
#!/bin/bash
# 建议使用双引号,支持转义字符和变量
my_name="tracy"
str="Hello, I am \"$my_name\"!"
echo $str
# 获取字符串长度
echo "字符串长度:"${#str}
# 提取子串,从第5个字符开始,提取5个字符
echo "提取子串:"${str:13:5}
# 查找字符e或者n的位置,那个先出现就先计算哪个
echo "查找字符e或n:"`expr index "$str" en`
2.数组
sh1-2.sh
#!/bin/bash
# 声明数组
array=(1 2 3 4 5)
# 单个元素赋值
array[5]=6
# 访问数组元素array[0]
echo ${array[0]}
# 取得数组元素个数 #array[@] 或者 #array[*]
length=${#array[@]}
echo "数组长度"$length
length=${#array[*]}
echo "数组长度"$length
# 获取数组中所有的元素
echo "数组中的所有的元素:"${array[*]}
echo "数组中的所有的元素:"${array[@]}
# 获取数组中所有的键
echo "数组中的所有的键:"${!array[*]}
echo "数组中的所有的键:"${!array[@]}
# 取得数组单个元素的长度
length=${#array[3]}
echo "第3个元素的长度"$length
# 使用key-value形式的数组,相当于字典
declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")
# 访问元素
echo ${site["google"]}
3.注释
sh1-3.sh
#!/bin/bash
# 这是单行注释
# 下面是多行注释,EOF可以替换成单引号、感叹号
:<<EOF
多行注释...
多行注释...
多行注释...
EOF
二、传递参数
- 首先,在执行脚本时传入一个参数列表:
./sh2.sh 1 2 3 4 5
- 在脚本中获取并处理参数:
sh2.sh
#!/bin/bash
# 获取参数
echo "获取参数:";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
# 获取参数个数
echo "参数个数为:$#"
# 获取所有参数
echo "所有参数:$*"
echo "所有参数:$@"
# 获取脚本运行的当前进程ID号
echo "当前进程ID号:$$"
# 获取后台运行的最后一个进程的ID号
echo "最后一个进程ID号:$!"
三、运算符
sh3.sh
#!/bin/bash
a=10
b=20
echo "---算术运算符---"
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
val=`expr $b == $a`
echo "b == a : $val"
val=`expr $b != $a`
echo "b != a : $val"
echo "---关系运算符---"
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
echo "---布尔运算符---"
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
echo "---逻辑运算符---"
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
四、打印命令
%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
sh4.sh
#!/bin/bash
echo "echo命令示例:"
echo -e "OK! \n" # -e 开启转义
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo '$name\"' # 单引号原样输出字符串,不转义
echo `date` # 显示命令执行结果
# printf格式化打印
echo "printf命令示例:"
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
五、文件测试
sh5.sh
#!/bin/bash
cd /usr/local
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
六、流程控制
sh6.sh
#!/bin/bash
echo -e "\n---单行的if else---\n"
a=1
b=2
if (($a == $b)); then echo "true"; else echo "false"; fi
echo -e "\n---多行的if else---\n"
if [ $(ps -ef | grep -c "ssh") -gt 1 ];
then
echo "true";
else
echo "false";
fi
echo -e "\n---elif---\n"
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
echo -e "\n---for循环---\n"
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
for str in This is a string
do
echo $str
done
echo -e "\n---while循环---\n"
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
echo -e "\n---until do循环---\n" # 相当于java的do while
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
echo -e "\n---case ... esac---\n" # 相当于java的switch case
num=2
case "$num" in
1) echo "您选择了1"
;;
2) echo "您选择了2"
;;
3) echo "您选择了3"
;;
esac
echo -e "\n---break用于跳出循环---\n"
for loop in 1 2 3 4 5
do
if (($loop == 3))
then
break
fi
echo "The value is: $loop"
done
echo -e "\n---continue用于跳过这轮循环---\n"
for loop in 1 2 3 4 5
do
if (($loop == 3))
then
continue
fi
echo "The value is: $loop"
done
七、函数
sh7.sh
#!/bin/bash
# 定义函数
fun(){
echo "fun"
# 获取传入的参数
echo "传入的第一个参数:$1"
}
# 调用
fun 1
八、输入输出到文件
sh8.sh
#!/bin/bash
echo -e "\n---将输出重定向到users文件(写入)---\n"
echo "tracy" > users
cat users
echo -e "\n---将输入重定向到users文件---\n"
# wc -l显示users文件的行数
wc -l < users
cat users
echo -e "\n---将输入重定向到users文件(追加)---\n"
# wc -l显示users文件的行数
echo "tracy1" >> users
cat users
附
bash关键字
Bash是一种常用的Unix和Linux操作系统的命令行解释器和脚本语言。以下是Bash中的一些关键字(keywords):
-
if
:条件语句的关键字,用于执行基于条件的分支。 -
then
:与if
语句配合使用的关键字,用于指定条件成立时要执行的命令。 -
else
:与if
语句配合使用的关键字,用于指定条件不成立时要执行的命令。 -
elif
:与if
语句配合使用的关键字,用于指定多个条件的判断。 -
fi
:与if
语句配合使用的关键字,用于结束条件语句块。 -
for
:循环语句的关键字,用于执行基于列表的循环。 -
while
:循环语句的关键字,用于执行基于条件的循环。 -
until
:循环语句的关键字,用于执行基于条件的循环,条件为假时继续执行。 -
do
:与循环语句配合使用的关键字,用于指定循环体的开始。 -
done
:与循环语句配合使用的关键字,用于结束循环体。 -
case
:条件语句的关键字,用于根据不同的条件执行不同的命令。 -
esac
:与case
语句配合使用的关键字,用于结束case
语句块。 -
function
:定义函数的关键字。 -
return
:从函数中返回的关键字。 -
break
:跳出循环或case
语句的关键字。 -
continue
:跳过当前循环的剩余部分并继续下一次循环的关键字。 -
declare
:声明变量或函数的关键字。 -
export
:导出变量为环境变量的关键字。 -
local
:声明局部变量的关键字。 -
readonly
:声明只读变量的关键字。
这些关键字在Bash中具有特殊的含义和功能,用于控制程序流程、定义函数、声明变量等。使用这些关键字可以编写复杂的脚本和命令,实现各种任务和逻辑。