export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
修改文件后,立即生效需要运行 source /etc/profile
设置永久的(对单一用户生效),用 vim 修改 ~/.bash_profile 文件,与上面操作一样
在计算机科学中,shell 是一个命令解释器,shell 脚本是 shell 编程的一种实现
shell 是位于操作系统和应用程序之间,是他们二者最主要的接口,shell 负责把应用程序的命令解释给操作系统,将操作系统处理后的结果解释给应用程序,所以,shell 相当于是应用程序与操作系统之间的媒介(翻译官的角色)

linux 内一般是 bash,mac 是 zsh,然后还有 windows 的cmd,不过最近 windows 发布了完整内核的 linux 子系统 WSL 2
查看当前系统的 shell 类型:echo $SHELL
定义:可执行的 linux 命令不在命令行下执行,而是通过一个文件执行时,称这个文件是 shell 脚本
一般用 vim 直接打开文件即可创建一个脚本,例如 vim start_service.sh 表示创建一个开启服务的脚本,脚本的内容自然是各种可执行的命令
#!/bin/bash echo 'start service~'
注释:单行使用 #,多行注释有两种方法,分别是 :<<! ... ! 和 :<<字符 ... 字符
#!/bin/bash echo '1' :<<! echo '3' echo '4' ! echo '5'
脚本执行方式:
bash /path/test.sh 使用 bash shell 执行脚本(脚本无可执行权限,或脚本内容首行没有指定 shell ,也可以用)
/path/test.sh 指定路径下执行脚本(需要脚本文件具有可执行权限)
source /path/test.sh 加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致
编写规范:
脚本首行必须指定脚本解释器:#!/bin/bash
首行后面要有脚本的基本信息等说明内容(常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等),尽量不要使用中文,防止乱码(linux服务器一般不支持中文)
代码编写规范,逻辑清晰
成对的内容一次性写出来,如:(), [], {}, ' ', " ", ` `
[ ] 中括号两端要有空格,编写时即可留出空格,然后再退格写内容
流程控制语句一次性写完,再添加具体内容
变量分为本地变量,全局变量, shell 内置变量
本地变量是当前系统的某个环境下才能生效的变量,作用范围小,包含普通变量和命令变量
普通变量:
方式一:变量名=变量值 (变量值必须是一个整体,中间没有特殊字符)
方式二:变量名='变量值' (变量值是什么,就是什么)
方式三:变量名="变量值" (如果变量值中含有可解析的变量A,那么会先解析变量A,将A的结果和变量中其它值组成一个整体,重新赋值给左边的变量名)
命令变量:
方式一:变量名=$(命令) 推荐用法,执行命令,将结果赋值给左边的变量名
方式二:变量名=`命令` 是反引号,不推荐
全局变量是当前系统所有环境下都能生效的变量
查看全局变量命令:env
定义全局变量的三种方法:
export 变量=值 (这种定义是临时的,在关闭 shell 时失效)
[root@centos7 ~]# VALUE='global variabel' [root@centos7 ~]# export VALUE [root@centos7 ~]# env | grep 'VALUE' VALUE=global variabel [root@centos7 ~]# export VALUE_TWO='global variabel' [root@centos7 ~]# env | grep 'VALUE' VALUE=global variabel VALUE_TWO=global variabel [root@centos7 ~]#
设置永久的(对所有用户生效),用 vim 修改 /etc/profile 文件,添加变量
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
修改文件后,立即生效需要运行 source /etc/profile
设置永久的(对单一用户生效),用 vim 修改 ~/.bash_profile 文件,与上面操作一样
shell 内置变量
本地变量,全局变量都是需要先定义,然后使用,那么 shell 内置变量就是直接使用实现某种具体功能的,如:$0,$n,$#
$0 获取当前执行的 shell 脚本文件名,包括脚本路径
$n 获取当前执行的 shell 脚本的第 n 个参数值,n=1...9,当 n 为 0 时表示脚本的文件名,如果 n 大于 9 就要用大括号括起来 ${10}
$# 获取当前执行的 shell 脚本中参数的总个数
$? 获取执行上一个命令的返回值(0 为成功,非 0 为失败)
#!/bin/bash echo "my scripts name is:$0" # current args amount echo $# # get target args echo $1 echo $2 echo $3 echo $4 # excute result echo $? 执行效果 [root@centos7 shell_exercise]# bash remaks.sh a b c d my scripts name is:remaks.sh 4 a b c d 0 [root@centos7 shell_exercise]#
变量内容的截取(切片)
${变量名:起始位置:截取长度}
${file:0:5} 从第1个字符开始,截取5个字符
${file::5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:5} 从第6个字符开始,截取后面所有的字符
${file:0-5} 从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
变量默认值
执行脚本时,往往会在脚本后面指定参数;但如果没有给定参数,那么可以设定默认值(类似于缺省参数)
场景一:执行脚本时,如给定了脚本中变量 a 的值,那么就将值赋予 $a,如果没有给定,那么在脚本中可以设定默认值
格式:${变量名:- 默认值}
如果我在命令后面补充了参数 n,那么输出内容是:receive args is n
如果我在命令后面没有补充参数,那么输出的内容是:receive args is 2
#!/bin/bash
a=$1
echo "receive args is ${a:-2}"
场景二:无论是否给定变量 a 的值,都输出默认值(感觉这个没有意义)
格式:${变量名 + 默认值}
#!/bin/bash
a=$1
echo "receive args a is ${a+666}"
变量的查看与删除
查看:
$变量名 在命令行 / 脚本中使用
"$变量名" 在命令行 / 脚本中使用
${变量名} echo "data access ${变量名} f "
"${变量名}" 推荐使用方式
删除: unset 变量名
使 shell 脚本具备一定的逻辑、运算能力
测试语句
[ 条件表达式 ]
条件成立返回 0;不成立返回 1
[root@centos7 shell_exercise]# [ 1 = 1 ] [root@centos7 shell_exercise]# echo $? 0 [root@centos7 shell_exercise]# [ 1 = 2 ] [root@centos7 shell_exercise]# echo $? 1 [root@centos7 shell_exercise]#
逻辑表达式
用来判断多个条件之间的依赖关系,常见的逻辑表达式有:&&,||
命令1 && 命令2 (如果命令1执行成功,才执行命令2;如果命令1执行失败,那么不执行命令2)
命令1 || 命令2 (如果命令1执行成功,那么不执行命令2;如果命令1执行失败,才执行命令2)
Demo:[ 1 = 1 ] (空格不能掉)
[root@centos7 shell_exercise]# [ 1 = 1 ] && echo "0" 0 [root@centos7 shell_exercise]# [ 1 = 2 ] && echo "0" [root@centos7 shell_exercise]# [ 1 = 1 ] || echo "0" [root@centos7 shell_exercise]# [ 1 = 2 ] || echo "0" 0 [root@centos7 shell_exercise]#
文件表达式
-f 根据输入内容,判断当前目录是否存在这个文件
[root@centos7 shell_exercise]# [ -f test.sh ] && echo "0" 0 [root@centos7 shell_exercise]# [ -f test.123 ] && echo "0"
-x 根据输入内容,判断当前目录是否存在这个文件,并且可执行
-d 根据输入内容,判断当前目录是否存在这个子目录
数值操作符
常见选项有:大于、小于、等于、不等于
n1 -eq n2
n1 -gt n2
n1 -lt n2
n1 -ne n2
字符串比较
str1 == str2 (str1 和 str2 字符串内容是否相同)
str1 != str2 (不相同)
[root@centos7 shell_exercise]# [ a == a ] [root@centos7 shell_exercise]# echo $? 0 [root@centos7 shell_exercise]# [ a != a ] [root@centos7 shell_exercise]# echo $? 1 [root@centos7 shell_exercise]#
计算表达式
进行算数计算
$(()) $((计算表达式)) 或者
let let 计算表达式 (let 更方便)
[root@centos7 shell_exercise]# echo $((100 / 5)) 20 [root@centos7 shell_exercise]# i=0 [root@centos7 shell_exercise]# let i=i+99 [root@centos7 shell_exercise]# echo $i 99 [root@centos7 shell_exercise]#
shell 中,流程控制语句主要分为两种:
简单的:判断和循环
复杂的:函数
if 判断语句
if
if [ 条件 ]
then
命令
fi
if else
if [ 条件 ]
then
命令1
else
命令2
if
if elif else
if [ 条件 ]
then
命令1
elif [条件2]
then
命令2
else
命令3
fi
生产场景demo
#!/bin/bash
if [ "$1" == "start" ];then
echo "start..."
elif [ "$1" == "stop" ];then
echo "stop..."
elif [ "$1" == "restart" ];then
echo "restart..."
else
echo "Usage: bash $0 [ start | stop | restart ]"
fi
case 选择语句
多 if 语句使用的时候,代码量很多,case 语句整体看起来效果会好一些
#!/bin/bash
case "$1" in
start)
echo "start..."
;;
stop)
echo "stop..."
;;
restart)
echo "restart..."
;;
*)
echo "Usage: bash $0 [ start | stop | restart ]"
;;
esac
for 循环语句
遍历列表
#!/bin/bash
for i in $(ls /root)
do
echo "${i}"
done
while 循环语句
#!/bin/bash
a="$1"
while [ "${a}" -lt 100 ]
do
echo "${a}"
a=$((a+1))
done
until 循环语句(与 while 功能重复,需要控制好临界点)
#!/bin/bash
a="$1"
until [ "${a}" -gt 100 ]
do
echo "${a}"
a=$((a+1))
done
函数就是将一些命令组合起来实现某种功能的方式,是脚本编写中非常重要的部分
函数格式(注意:函数调用的时候不要加括号):
#!/bin/bash
func_test(){
echo "my name is johny, I 19 yesrs old"
}
func_test
函数传参(内部传参)
#!/bin/bash
func_test(){
echo "my name is $1, I $2 yesrs old"
}
func_test anson 20
函数传参(脚本传参)
#!/bin/bash
func_test(){
echo "my name is $1, I $2 yesrs old"
}
func_test $1 $2# 脚本传参bash case.sh anson 20
写一个启动脚本:
#!/bin/bash
# local variabel
args="$1"
# help information
usage(){
echo "the script is used as follows: $0 [ start|stop|restart ]"
}
# main func
if [ $# -eq 1 ];then
case "${args}" in
start)
echo "service startup..."
;;
stop)
echo "service stoped..."
;;
restart)
echo "service restart..."
;;
*)
usage
;;
esac
else
usage
fi
end~
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
修改文件后,立即生效需要运行 source /etc/profile
设置永久的(对单一用户生效),用 vim 修改 ~/.bash_profile 文件,与上面操作一样
来源:https://www.cnblogs.com/kaichenkai/p/10848143.html