Linux 学习笔记(3) —— Shell 批处理脚本
目录
????????Shell 脚本就是把一批命令集合在一起,一起解决一些复杂的问题。Shell 中有变量、循环、函数等内容,类似于程序设计,但本质上不是程序设计。
? ? ? ? Window 系统中的 Shell —— PowerShell。
0、起步前的一些内容
0-1)给命令设置别名并使用(alias)
? ? ? ? alias 别名="原来的命令"
? ? ? ? 可以简化使用频率较多的、长度较长的命令的使用。
0-2)在一行中用 “ ; ” 来分割不同的命令
0-3)直接创建变量、使用变量
read?myname | 给变量 myname 赋值 |
read?myname?password | 给两个变量同时赋值,以空格区分 |
echo?$myname | 输出变量的值 |
username='zhangsan' | 直接创建变量并赋值(等号两侧不能有空格) |
testname='张三'??readonly?testname | 声明只读的变量,只读变量不能改变值 |
????????注意,在给变量赋值的命令中,如果等号两侧有空格,则会处理失败。如下图,如果等号左右两边都有空格,则会把第一个 username 作为命令,= 作为命令的第一个参数,'abc' 作为第二个参数来进行处理。
0-4)关于环境变量
? ? ? ? ?环境变量是指当前操作系统中预定好的一批全局变量,可以在任意位置引用。
? ? ? ? 在 Linux 和 Window 系统中都有环境变量。
? ? ? ? 使用频率最高的环境变量是 PATH,PATH 中定义了一批文件夹(路径),表示只要是在这个目录下的命令,就可以在命令行中直接执行,而不需要输入完整的路径。
set | 设置当前shell的变量,包括当前用户的变量 |
env | 显示当前用户的变量 |
export | 显示当前导出成用户变量的shell变量 |
export?PATH=$PATH:/opt | 修改PATH环境变量为原来的值加上一个/opt目录,即把/opt目录添加进环境变量PATH中 |
cat?/etc/profile | 全局的环境变量,对任何的用户都生效 |
cd?~;cat?.bash_history | 当前用户主目录下的环境变量,仅对当前用户生效(本地变量) |
echo?$PATH | 输出环境变量PATH的内容 |
unset?NAME | 删除一个环境变量 |
echo?$USER | 当前登录的用户名 |
echo?$UID | 当前用户的ID |
echo?$HOME | 当前用户的主目录 |
echo?$PS1 | |
export?PS1="Hello?\h?##?" | 临时的重新配置,重新连接后会重置会原样 |
export?PS1="[\u@\h?\W]\\$?" | 恢复原样 |
0-5)关于 echo
echo?-e?'Hello\nworld' | -e?是输出时支持转义符(在这里是换行) |
echo?'Hello\nWorld' | 如果没有-e则会将转义符一起输出 |
echo?-e?'\a' | 蜂鸣(警告时可用使用) |
echo?-e?'helloo\bworld' | \b?是退格,输出?helloworld |
0-6)expr 进行比较和整数计算等
? ? ? ? exper 可以处理整数的计算,浮点数不能参与其中
?
? ? ? ? ?对数值或字符串进行比较,注意空格。
?
? ? ? ? ?匹配字符串、查找字符串中是否包含字符、计算字符串的长度等
? ? ? ? 计算字符串的长度
? ? ? ? 计算匹配字符串的长度,可以看见是从头开始匹配的,返回的是匹配的字符个数。
? ? ? ? 计算两个字符串是否相等
? ? ? ? ?查找字符串中是否含有某个字符,返回第一次出现的下标
0-7)使用 | bc 可以处理浮点运算
? ? ? ? echo 输出 123.45 * 2.0 然后通过管道符交给 bc 进行处理,bc 是一个任意精度的计算器语言?。
1、编写一个最简单的 Shell 脚本
? ? ? ? Shell 脚本中的每一行都是一个可以独立运行的命令。
?
? ? ? ? 编写一个脚本 shell-01.sh ,其中的内容如下:?
vi?shell-01.sh | 创建一个shell?脚本文件并写入内容 |
sh?shell-01.sh | 执行 shell 脚本,于bash?xxx相同 |
source?shell-01.sh | 执行 shell 脚本(推荐使用) |
bash?shell-01.sh | 使用bash壳程序来执行shell脚本(推荐使用) |
.?shell-01.sh | 执行shell脚本 |
./shell-01.sh | 执行shell脚本,使用前需要给user添加该文件的执行权限(chmod?u+x?shell-01.sh) |
????????执行该脚本?
2、Shell 脚本 接收参数
????????shell?脚本中接收的参数使用?${1}、${2}·····${9}?(或?$1、$2···)进行表示,$# 统计一共接收到多少个参数。
? ? ? ? 注意,如果使用 $x 的形式,则最多只能接受 9 个参数;而使用 ${x}的形式,则能接受到很多个。
? ? ? ? 如果:$10,本意想接收第十个参数,实际上输出的是第一个参数拼接上 0 的结果。
? ? ? ? 执行结果:?
3、Shell 中三个引号的区别
? ? ? ? 三个引号分别为单引号(''),双引号(""),反引号(``).
单引号?'' | 单引号里的内容原样输出 |
双引号?"" | 双引号里面的变量能够正常的被替换 |
反引号?`` | 会执行引号内中的命令 可以使用反引号执行一个命令,并把输出的结果赋值给一个变量 now=`date` |
4、几个括号的使用
(()) | 用于重定义变量的值,可以代替 expr;也可以用作 for 循环 |
$(()) | 用于整数运算,里面的变量可加 $ 开头也可以不加 |
${} | 可以取特定参数或变量的值,如?${1}?、${username} |
$() | 可以代替反引号,执行圆括号里面的命令。称为命令替换,它允许你将一个命令的输出结果赋值给一个变量或在命令行中直接使用 |
$[] | 用于整数运算,可以代替 expr |
参考:https://www.cnblogs.com/chengd/p/7803664.html
5、几个特殊的变量
$# | 传递到脚本的参数个数 |
$0 | 脚本的名称 |
$* | 以一个单字符串的形式显示所有向脚本传递的参数,输出时的参数个数可以超过9个 |
$$ | 脚本运行的当前进程id号 |
$! | 后台运行的最后一个进程的进程id号 |
$@ | 显示所有向脚本传递的参数,每一个参数都是一个单独的字符串 |
$? | 显示最后命令的退出状态,0表示正确,其他任何值表示错误;可以在脚本中自定义0-255的退出状态码 |
$_ | 上一个命令的最后一个参数 |
参考:Bash Shell $*, $@, $#, $$, $!, $?, $- 和 $_ - 知乎
?
6、顺序控制语句
# if后面跟着的是一条可执行命令,判断的依据就是该命令是否执行成功,返回 1
if 条件
then
命令
fi
## 或者 ##
if 条件; then
命令
fi
####
if 条件
then
命令
else
命令
fi
?????????以下的一个 shell 程序,验证用户输入的参数是否为 hello。
if [[ $# -ne 1 ]]
then
echo "请输入一个参数"
return 2
fi
echo "continue"
sourceLength=`expr length 'hello'`
paramsLength=`expr length $1`
if [[ $sourceLength -eq $paramsLength ]];then
echo "equal"
else
echo "no"
fi
????????多重分支结构
# 多重分支结构,计算第一个参数加上 第二个参数与第三个参数的积 的和
# 先判断有没有三个参数,如果满足再判断前三个参数是不是都是数字
if [ $# -lt 3 ]; then
echo '请输入3个数字参数'
#exit 100 # 自己定义退出码,会退出连接状态,需要重新连接
return 100
elif [[ ${1} =~ ^[0-9]+$ && ${2} =~ ^[0-9]+$ && ${3} =~ ^[0-9]+$ ]]; then
echo "$1 + $2 * $3" | bc
else
echo "输入的内容不合法"
fi
case 的匹配结构
num=$1
case $num in
1)
echo '接收到数字 1'
;;
2)
echo '接收到数字 2'
;;
3)
echo '接收到数字 3'
;;
*)
echo '接收到其他内容'
esac
7、循环结构
? ? ? ? 计算 1+2+3+4+5 的和?
7-1)for 循环?
sum=0
for i in 1 2 3 4 5;
do
let sum+=i # 即 let sum=sum+i
done
echo $sum
sum=0
for i in 1 2 3 4 5;
# 也可以写成 for i in {1..5};
# 也可以写成 for ((i=0 ; i<=100 ; i+=1));
do
((sum+=i)) # 双括号表达式
# 其他的写法
# 1)
# sum=`expr $num + $i`
# 2)
# sum=`echo "$num + $i" | bc`
done
echo $sum
使用 break 退出当前一层的循环
7-2)while 循环
i=1
sum=0
while [[ $i -le 5 ]]
do
((sum+=i))
((i++))
done
echo $sum
8、函数
# 定义一个函数
function add(){
let sum=$1+$2 # 这里的 $1 和 $2 是传给函数的两个参数
echo $sum # echo相当于程序设计中的return,设置返回的内容
}
# 调用add函数 并传入参数
# add 123 11 # 传入自定义的参数
# add ${1} ${2} # 使用的时候传入参数
# 让函数的返回值赋值给一个变量
# result=`add 123 123`
result=$(add 123 $2) # 等价于反引号
echo "result 的结果是:$result"
使用函数来计算阶乘
res=1
function jie_cheng(){
if [[ $1 -gt 1 ]];then
res=$(($1 * res))
echo `jie_cheng $(( $1 - 1 ))` # 递归调用
else
echo $res
fi
}
jie_cheng ${1} # 调用函数,并传入程序接收到的第一个参数
9、数组
# 定义数组
# declare -a seasons
# 依次给数组中的元素赋值
# seasons[0]="Spring" # 如果字符串中有空格,则需要使用单引号
# seasons[1]="Summer"
# seasons[2]="Autumn"
# seasons[3]="Winter"
# 数组取值
# echo ${seasons[@]} # 输出数组中的全部内容
# echo ${seasons[1]} # 取数组的特定值
# 遍历数组
# for season in ${seasons[@]}; do
# echo ${season}
# done
# 修改数组中的指定值
#seasons[1]="None"
# echo ${seasons[@]}
# 取数组的长度
# echo "当前数组的长度:${#seasons[@]}"
# let count=${#seasons[@]}-1
# for ((i=0;i<=count;i++)); do
# echo "$i ${seasons[$i]}"
# done
# 另一种定义数组的方式
seasons=("Spring" "Summer" "Autumn" "Winter")
for ((i=0;i<${#seasons[@]};i++));do
echo "$i: ${seasons[$i]}"
done
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!