目录
shell 脚本
shell 概述
shell 分类
shell 语法
shell 脚本的定义与执行
自定义变量
环境变量
预设变量
脚本变量的特殊用法
条件测试语句->文件
条件测试语句->字符串
条件测试语句->数字
控制语句
函数
shell 脚本
shell 概述
shell 是用户和 Linux 内核之间的接口程序
Linux 系统中提供了好几种不同的 shell 命令解释器,如 sh、ash、bash 等。一般默认使用 bash 作为默认的解释器。
shell 分类
系统调用脚本
/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置开始自启动的程序,一般也在这里设置
~/.bashrc
用Home目录的.bashrc,登录时会自动调用,打开任意终端时也会自动调用这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等
用户调用脚本
用户编写的脚本
shell 语法
shell 脚本的定义与执行
1、定义以开头:#!/bin/bash,#!用来声明脚本由什么 shell 解释,否则使用默认 shell
2、单个"#"号代表注释当前行
3、执行:
./test.sh
bash test.sh 直接指定使用 bash 解释 test.sh
. test.sh 使用当前 shell 读取解释 test.sh
自定义变量
定义变量
变量名=变量值
如:num=10
引用变量
$变量名
如:i=$num 把变量 num 的值赋给变量 i
显示变量
使用 echo 命令可以显示单个变量取值
echo $num
清除变量
使用 unset 命令清除变量
unset varname
read string
从键盘输入一个字符串付给变量 string
readonly var=100
定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除。
export var=300
使用 export 说明的变量,会被导出为环境变量,其它 shell 均可使用
等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来;
双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。
var.sh
#!/bin/bash
echo "this is the var test shell script "
name="edu"
echo "$name is me"
echo '$name is me'
echo "please input a string"
read string
echo "the string of your input is $string"
readonly var=1000
#var=200
export public_var=300
环境变量
方法1:临时设置
在终端执行命令
SELF_VAL=999
export SELF_VAL
方法2:永久设置
需要在配置文件(~/.bashrc或/etc/profile)中进行设置即可,设置完毕后需要通过source命令配置文件立即生效
#!/bin/bash
echo "You are welcome to use bash"
echo "Current work dirctory is $PWD"
echo "the host name is $HOSTNAME"
echo "your home dir $HOME"
echo "Your shell is $SHELL"
echo "user env val is $SELF_VAL"
执行结果
richard@rich:~/workspace$ ./export.sh
You are welcome to use bash
Current work dirctory is /home/richard/workspace
the host name is rich
your home dir /home/richard
Your shell is /bin/bash
user env val is 999
预设变量
$#:传给shell脚本参数的数量
$*:传给shell脚本参数的内容
$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
$?:命令执行后返回的状态,"$?":用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
$0:当前执行的进程名
$$:当前进程的进程号
pre.sh
#! /bin/bash
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$5 = $5"
echo "\$6 = $6"
echo "\$7 = $7"
echo "\$8 = $8"
echo "\$9 = $9"
# if more than 9, must use {}
echo "\${10} = ${10}"
echo "\${11} = ${11}"
echo "\${12} = ${12}"
# 传给shell脚本参数的数量
echo "\$# = $#"
# 传给shell脚本参数的内容
echo "\$* = $*"
# 命令执行后返回的状态
echo "\$? = $?"
# $0:当前执行的进程名
echo "\$0 = $0"
# 获取当前进程的进程号
echo "\$$ = $$"
执行结果
richard@rich:~/workspace$ ./pre.sh 12 13 14 15 a b c d e f g h
$1 = 12
$2 = 13
$5 = a
$6 = b
$7 = c
$8 = d
$9 = e
${10} = f
${11} = g
${12} = h
$# = 12
$* = 12 13 14 15 a b c d e f g h
$? = 0
$0 = ./pre.sh
$$ = 129085
脚本变量的特殊用法
""(双引号):包含的变量会被解释
''(单引号):包含的变量会当做字符串解释
``(数字键1左面的反引号) :反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
richard@rich:~/workspace$ echo "today is `date` "
today is 2023年 03月 20日 星期一 16:31:30 CST
\ 转义字符 : 同c语言 \n \t \r \a等 echo命令需加-e转义
(命令序列) :由子 shell 来完成,不影响当前 shell 中的变量
{ 命令序列 } : 在当前 shell 中执行,会影响当前变量
#!/bin/bash
name="zhangsan"
#双引号里面的特殊字符,会使用其特殊含义
string1="good moring $name"
#单引号里面的特殊字符,都会失去特殊含义
string2='good moring $name'
echo $string1
echo $string2
echo "-------------------------------"
#反引号:获取一个shell命令的输出结果,一般对有输出结果的命令经常去使用,也可以使用$()与反引号等价
echo "today is date"
echo "today is `date`"
echo 'today is `date`'
echo "-------------------------------"
echo "My dir ls command result: $(ls)"
echo "-------------------------------"
#转义字符:使用时,需要在echo后面加上‐e选项
num=100
#由子shell来完成,不会改变shell中的变量的值
( num=999;echo "in 1 $num" )
echo out 1:$num
echo "-------------------------------"
#在当前shell中执行,会改变shell中的变量的值
{ num=666; echo "in 2 $num"; }
echo out 2:$num
echo "-------------------------------"
条件测试语句->文件
按照文件类型
-e 文件名 文件是否存在
-s 文件名 是否为非空
-b 文件名 块设备文件
-c 文件名 字符设备文件
-d 文件名 目录文件
-f 文件名 普通文件
-L 文件名 软链接文件
-S 文件名 套接字文件
-p 文件名 管道文件
按照文件权限
-r 文件名 可读
-w 文件名 可写
-x 文件名 可执行
两个文件之间的比较
文件 1 -nt 文件 2 文件 1 的修改时间是否比文件 2 新
文件 1 -ot 文件 2 文件 1 的修改时间是否比文件 2 旧
文件 1 -ef 文件 2 两个文件的 inode 节点号是否一样,用于判断是否是硬链接
#!/bin/bash
# -e 文件名 文件是否存在
test -e /dev/qaz
echo $?
echo "--------------------------"
# -e 文件名 文件是否存在
test -e /home
echo $?
echo "--------------------------"
# -d 文件名 目录文件
test -d /home
echo $?
echo "--------------------------"
# -r 文件名 可读
# -w 文件名 可写
# -x 文件名 可执行
mkdir test_sh
chmod 500 test_sh
[ -r test_sh ]
echo $?
[ -w test_sh ]
echo $?
[ -x test_sh ]
echo $?
[ -s test_sh ]
echo $?
echo "--------------------------"
条件测试语句->字符串
s1 = s2 测试两个字符串的内容是否一样
s1 != s2 测试两个字符串的内容是否不一样
-z s1 测试 s1 字符串的长度是否为 0
-n s1 测试 s1 字符串的长度是否不为
#!/bin/bash
test -z $yn
echo $?
echo "please input a yn"
read yn
[ -z "$yn" ]
echo 1:$?
[ $yn = "y" ]
echo 2:$?
条件测试语句->数字
a -eq b 测试 a 与 b 是否相等
a -ne b 测试 a 与 b 是否不相等
a -gt b 测试 a 是否大于 b
a -ge b 测试 a 是否大于等于 b
a -lt b 测试 a 是否小于 b
a -le b 测试 a 是否小于等于 b
#!/bin/bash
echo "please input a num(1-9)"
read num
[ $num -eq 5 ]
echo $?
[ $num -ne 5 ]
echo $?
控制语句
if 控制语句
格式一:
if [ 条件 1 ]; then
执行第一段程序
else
执行第二段程序
fi
格式二:
if [ 条件 1 ]; then
执行第一段程序
elif [ 条件 2 ];then
执行第二段程序
else
执行第三段程序
fi
if_then.sh
#!/bin/bash
echo "Press y to continue"
read yn
if [ $yn = "y" ]; then
echo "script is running..."
else
echo "stopped!"
fi
case 控制语句
case $变量名称 in
“第一个变量内容”)
程序段一
;;
“第二个变量内容”)
程序段二
;;
*)
其它程序段
exit 1
esac
case1.sh
#!/bin/bash
echo "This script will print your choice"
case "$1" in
"one")
echo "your choice is one"
;;
"two")
echo "your choice is two"
;;
"three")
echo "Your choice is three"
;;
*)
echo "Error Please try again!"
exit 1
;;
esac
case2.sh
#!/bin/bash
echo "Please input your choice:"
read choice
case "$choice" in
Y | yes | Yes | YES)
echo "It's right"
;;
N* | n*)
echo "It's wrong"
;;
*)
exit 1
esac
for 控制语句
形式一
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
for1.sh
#!/bin/bash
# declare 是 bash 的一个内建命令,可以用来声明 shell 变量、设置变量的属性。
# declare 也可以写作 typeset。
declare -i s
declare -i sum
for (( i=1; i<=100; i=i+1 ))
do
sum=sum+i
done
echo "The result is $sum"
形式二
for var in con1 con2 con3 ...
do
程序段
done
for2.sh
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do
echo $i
done
for3.sh
#!/bin/bash
for name in `ls`
do
if [ -f $name ];then
echo "$name is file"
elif [ -d $name ];then
echo "$name is directory"
else
echo "other"
fi
done
while 控制语句
while [ condition ]
do
程序段
done
当 condition 成立的时候进入 while 循环,直到 condition 不成立时才退出循环。
_while.sh
#!/bin/bash
declare -i i
declare -i s
while [ "$i" != "101" ]
do
s+=i;
i=i+1;
done
echo "The count is $s"
unitl 控制语句
until [ condition ]
do
程序段
done
这种方式与 while 恰恰相反,当 condition 成立的时候退出循环,否则继续循环。
#!/bin/bash
declare -i i
declare -i s
until [ "$i" = "101" ]
do
s+=i;
i=i+1;
done
echo "The count is $s"
函数
定义函数的两种格式:
格式一:
函数名() {
命令 ...
}
格式二:
function 函数名() {
命令 ...
}
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中
所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至
shell
解释器首次发现它时,才可以使用
调用函数的格式为:
函数名
param1 param2
……
使用参数同在一般脚本中使用特殊变量
$1
,
$2 ...$9
一样
函数可以使用
return
提前结束并带回返回值
return
从函数中返回,用最后状态命令决定返回值。
return 0
无错误返回
return 1
有错误返回
#!/bin/bash
is_it_directory()
{
if [ $# -lt 1 ]; then
echo "I need an argument"
return 1
fi
if [ ! -d $1 ]; then
return 2
else
return 3
fi
}
echo -n "enter destination directory:"
read direct
is_it_directory $direct
echo "the result is $?"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)