shell基础
变量逻辑控制shell 脚本demo函数
1、变量
定义一个 a=1 的变量,然后输入 echo $a 指令,其中 $a 表示可以引用这个变量
a=1
echo $a
b=hello
echo $b
c=hello world
echo $c
这时候会报错,因为 x=hello 会被认为是一个变量赋值,而 world 会被认为是另外一个独立的命令
c="hello world"
echo $c
需要对字符串加上单引号或者双引号。然后再打印这个变量
知识点一: 单引号和双引号的区别?
01、单引号和双引号的区别在于是否支持转义,双引号可以对转义符号进行处理
02、= 左右不要有空格;
03、如果内容有空格,需要使用单引号或双引号;
04、双引号支持转义符,$ 开头的变量会被自动替换;
知识点二:几个预定义变量
01、PWD 表示当前目录;
02、USER 表示当前用户;
03、HOME 表示当前用户的主目录,HOME 还可以用 ~ 简写;
04、PATH 表示当前所有可执行程序;
05、RANDOM 可以产生一个随机数
echo $PWD
echo $USER
echo $HOME 或者 echo ~
echo $PATH
echo $RANDOM
1.2、输入 x=$(echo mryt_qa) 指令将字符串 mryt_qa 存入 x 变量中,这时输入 echo $x 指令,你会看到 $() 会把括号内的命令执行然后把输出结果作为值传递给变量
x=$(echo mryt_qa)
echo $x
1.3、序列,从 1~10 获取一个序列,可以输入 echo {1..10} 指令来打印 1~10 的数字
echo {1..10} 或者 seq 1 10
---
2、逻辑控制
知识点三、shell中的逻辑控制与python基础一致,常见包含:
01、条件判断 if;
02、分支判断 case、select,根据不同的条件进行不同的处理;
03、循环 for、while、until;
04、break 和 continue,退出循环;
2.1、输入 for i in $(seq 1 3 10) 指令,然后在 do 语句块中打印 echo $i 的值,do 语句块以 done 结束
for i in $(seq 1 3 10)
do
echo $i
done
2.2、定义 i=0, 输出结果每隔 1 秒打印一个 i 的值,而 i 的值逐渐增加,直到等于 3 时不再满足条件,退出循环
i=0
while ((i<3));do ((i=i+1));sleep 1;echo $i;done
2.3、while read line 循环读取文件的每一行
while read line; do echo $line;done < /tmp/first.txt
2.4、或者通过管道也可以等价
cat /tmp/first.txt | while read line;do echo $line;done
---
3、shell 脚本demo
3.1、输入 vim /tmp/demo.sh 指令创建了 demo.sh 文件
vim /tmp/demo.sh
3.2、demo.sh 输入p0=$0、p1=$1 p2=$2,以及 $@ 和 $*并打印
#!/bin/sh
# 脚本注释: 脚本demo,程序不会执行注释
echo p0=$0
echo p1=$1 p2=$2
echo $@
echo $*
执行:bash /tmp/demo.sh
使用 bash /tmp/1.sh,在执行结果中 $0 是当前的文件名,但此时参数没有值, 显示
p0=/tmp/demo.sh
p1= p2=
3.3、输入参数 x、y 传递给脚本,你可以看到输出结果中第一个参数是 x,第二个参数是 y,这就是参数的解析规则
bash /tmp/demo.sh x y
知识点四:$@ 与 $* 都表示所有的参数但它们有什么区别?
答:可以简单的理解成 $* 会把参数打散,参考以下例子
3.4、比如第二个参数是包含空格的,将 "m n" 作为一个完整的参数传递给脚本并执行,你会发现第二个参数是 m n,但其实 $@ 与 $* 的值已经发生了变化,$* 会将参数打散,而 "$@" 则不会
bash /tmp/demo.sh x "m n"
3.5、demo.sh 使用 for 循环来分别打印 "$@" 和 $* 所代表的参数
#!/bin/sh
#脚本注释: 脚本demo,程序不会执行注释
echo p0=$0
echo p1=$1 p2=$2
for p in "$@";do
echo $p
done
echo $*
for p in $*,do
echo $p
done
执行以上脚本,如果是"$@",第一个参数打印的是 x,第二个参数打印的是 m n,而 $* 把第二个参数拆成了两个
---
4、函数
函数是以函数名()后跟 {} 括起来的内容组成,函数可以实现一些功能封装,同时函数也支持与脚本类似的参数解析
4.1、定义一个 hello 函数,在函数中通过 if 语句判断第一个参数 $1 是否等于 python,如果等于就打印 python测试。然后运行 hello 函数,你会发现什么都没有,是因为你并没有给函数传入一个参数,传入 shell 参数后,系统打印 学习shell基础
hello(){
if [ "$1" = "python" ]; then echo python测试; fi
}
执行:
hello
hello python
4.2、demo.sh脚本里通过 elif 判断 $1 是否等于 java,如果等于 java 就打印 java 测试
#!/bin/sh
#脚本注释: 脚本demo,程序不会执行注释
echo p0=$0
echo p1=$1 p2=$2
for p in "$@";do
echo $p
done
echo $*
for p in $*;do
echo $p
done
if [ "$1" = "python" ]; then
echo python测试
elif [ "$1" = "java" ]; then
echo java测试
fi
执行:
bash /tmp/demo.sh python
bash /tmp/demo.sh java
4.3、demo.sh封装成一个 hello 函数,有了函数之后就可以在执行的过程中随时进行调用来实现功能封装和逻辑复用
#!/bin/sh
#脚本注释: 脚本demo,程序不会执行注释
echo p0=$0
echo p1=$1 p2=$2
for p in "$@";do
echo $p
done
echo $*
for p in $*;do
echo $p
done
# if [ "$1" = "python" ]; then
# echo python测试
# elif [ "$1" = "java" ]; then
# echo java测试
# fi
hello(){
if [ "$1" = "python" ]; then
echo python测试
elif [ "$1" = "java" ]; then
echo java测试
fi
}
hello $2 # 运行 hogwarts 函数并将 $2 参数传给它,此时 $2 是脚本的第二个参数,但却是 hogwarts函数 的第一个参数
执行:
bash /tmp/demo.sh java
bash /tmp/demo.sh python
bash /tmp/demo.sh python java